首页 文章

Android Modal Dialog实现了Singleton模式

提问于
浏览
0

MY SINGLETON MODAL DIALOG CLASS

⁃   public class CustomDialogMsgOneBtn
⁃   {
⁃   
⁃      private static CustomDialogMsgOneBtn _instance;
⁃   
⁃      private UIHandler uiHandler;
⁃      public Context _context;
⁃      public Dialog _dialog;
⁃      private Object synchObject = new Object();
⁃   
⁃      private TextView _tvDialogTitle;
⁃      private TextView _tvDialogMessage;
⁃      private String _dialogTitle;
⁃      private String _dialogMessage;
⁃      private Button _btnDialogOk;
⁃      private String _btnTextOk;
⁃   
⁃      private CustomDialogMsgOneBtn()
⁃      {
⁃   
⁃      }
⁃      public static CustomDialogMsgOneBtn getInstance()
⁃      {
⁃         if( _instance == null )
⁃         {
⁃            _instance = new CustomDialogMsgOneBtn();
⁃         }
⁃         return _instance;
⁃      }
⁃   
⁃      public void setTitleAndMessage( String title, String msg )
⁃      {
⁃         this._dialogTitle = title;
⁃         this._dialogMessage = msg;
⁃      }
⁃   
⁃      public void initDialog( Context c )
⁃      {
⁃         _context = c;
⁃      }
⁃   
⁃      public void setButtonTextOk( String sText )
⁃      {
⁃         this._btnTextOk = sText;
⁃      }
⁃   
⁃      private void constructUiThread()
⁃      {
⁃         HandlerThread uiThread = new HandlerThread( "UIHandler" );
⁃         uiThread.start();
⁃         uiHandler = new UIHandler( uiThread.getLooper() );
⁃      }
⁃   
⁃      public void show()
⁃      {
⁃         try
⁃         {
⁃            constructUiThread();
⁃   
⁃            uiHandler.sendEmptyMessage( 0 );
⁃   
⁃            synchronized( synchObject )
⁃            {
⁃               try
⁃               {
⁃                  synchObject.wait();
⁃               }
⁃               catch( InterruptedException e )
⁃               {
⁃                  e.printStackTrace();
⁃               }
⁃            }
⁃   
⁃         }
⁃         catch( Exception e )
⁃         {
⁃            e.printStackTrace();
⁃         }
⁃   
⁃      }
⁃   
⁃      public void dismissDialog()
⁃      {
⁃         _dialog.dismiss();
⁃      }
⁃   
⁃      private final class UIHandler extends Handler
⁃      {
⁃   
⁃         public View.OnClickListener btnListener = new View.OnClickListener()
⁃         {
⁃   
⁃            @Override
⁃            public void onClick( View v )
⁃            {
⁃   
⁃               int id = v.getId();
⁃               if( id == R.id.btnDialogOk )
⁃               {
⁃                  Log.d( "dialog Ok", "Ok" );
⁃   
⁃                  notifySync();
⁃               }
⁃   
⁃            }
⁃         };
⁃   
⁃         public DialogInterface.OnDismissListener dialogOnDismissListener = new DialogInterface.OnDismissListener()
⁃         {
⁃   
⁃            @Override
⁃            public void onDismiss( DialogInterface dialog )
⁃            {
⁃   
⁃               notifySync();
⁃               Log.d( "dialog being dismissed", "dismiss ang dialog" );
⁃            }
⁃         };
⁃   
⁃         public UIHandler( Looper looper )
⁃         {
⁃            super( looper );
⁃         }
⁃   
⁃         @Override
⁃         public void handleMessage( Message msg )
⁃         {
⁃            _dialog = new Dialog( _context );
⁃            _dialog.requestWindowFeature( Window.FEATURE_NO_TITLE );
⁃            _dialog.setCanceledOnTouchOutside( true );
⁃            _dialog.setContentView( R.layout.dialog_message_one_button );
⁃            _dialog.setOnDismissListener( dialogOnDismissListener );
⁃   
⁃            _tvDialogTitle = (TextView)_dialog.findViewById( R.id.txtDialogTitle );
⁃            _tvDialogMessage = (TextView)_dialog.findViewById( R.id.txtDialogMsg );
⁃            _btnDialogOk = (Button)_dialog.findViewById( R.id.btnDialogOk );
⁃   
⁃            _tvDialogTitle.setText( _dialogTitle );
⁃            _tvDialogMessage.setText( _dialogMessage );
⁃            _btnDialogOk.setText( _btnTextOk );
⁃   
⁃            _btnDialogOk.setOnClickListener( btnListener );
⁃   
⁃            _dialog.show();
⁃   
⁃         }
⁃   
⁃         private void notifySync()
⁃         {
⁃            synchronized( synchObject )
⁃            {
⁃               _dialog.dismiss();
⁃               synchObject.notifyAll();
⁃            }
⁃         }
⁃   
⁃      }// end UIHanlder class
⁃   
⁃   } //end Class

___HOW I CALL IT ON MY ACTIVITY CLASS

CustomDialogMsgTwoBtn.getInstance().initDialog(this);
CustomDialogMsgTwoBtn.getInstance().setLeftAndRightButtonText( "cancel", "accept" );
CustomDialogMsgTwoBtn.getInstance().setTitleAndMessage( "Custom Dialog", "test msg" );
CustomDialogMsgTwoBtn.getInstance().show();

09-16 08:41:42.934:I / InputDispatcher(286):应用程序没有响应:AppWindowToken {41c8f4f8 token = Token {41c05558 ActivityRecord {4205b5a0 u0 com.templatea / com.templatea.MainActivity}}} - Window {41995bf0 u0 com.example.esf_templatea / com.templatea.MainActivity} . 自事件发生以来已经达到5008.4ms,等待起5006.8ms . 原因:等待,因为焦点窗口尚未完成处理先前传递给它的输入事件 . 09-16 08:41:42.934:I / WindowManager(286):输入事件调度超时发送到com.example / com.templatea.MainActivity 09-16 08:41:43.184:I / Process(286):发送信号 . PID:7296 SIG:3 09-16 08:41:43.194:I / dalvikvm(7296):threadid = 3:对信号作出反应3 09-16 08:41:43.255:I / dalvikvm(7296):写入堆栈跟踪到'/ data / anr / traces.txt'09-16 08:41:43.255:I / Process(286):发送信号 . PID:286 SIG:3 09-16 08:41:43.255:I / dalvikvm(286):threadid = 3:对信号做出反应3 09-16 08:41:43.745:I / dalvikvm(286):写入堆栈跟踪到'/data/anr/traces.txt'09-16 08:41:43.745:I / Process(286):发送信号 . PID:404 SIG:3 09-16 08:41:43.745:I / dalvikvm(404):threadid = 3:对信号做出反应3 09-16 08:41:43.854:I / dalvikvm(404):写入堆栈跟踪到'/data/anr/traces.txt'09-16 08:41:43.864:I / Process(286):发送信号 . PID:446 SIG:3 09-16 08:41:43.864:I / dalvikvm(446):threadid = 3:对信号作出反应3 09-16 08:41:43.985:I / dalvikvm(446):写入堆栈跟踪'/data/anr/traces.txt'09-16 08:41:44.645:D / dalvikvm(286):GC_EXPLICIT释放3213K,50%免费6742K / 13296K,暂停4ms 10ms,总计113ms 09-16 08:41: 45.234:E / ActivityManager(286):com.emplatea中的ANR(com.templatea / com.templatea.MainActivity)09-16 08:41:45.234:E / ActivityManager(286):原因:keyDispatchingTimedOut 09-16 08:41 :45.234:E / ActivityManager(286):加载:0.2 / 0.15 / 0.09 09-16 08:41:45.234:E / ActivityManager(286):CPU使用率从17189ms到0ms前:09-16 08:41:45.234: E / ActivityManager(286):1.1%46 / adbd:0.2%用户0.8%内核/故障:180次09-16 08:41:45.234:E / ActivityManager(286):1.1%286 / system_server:0.9%用户0.1 %kernel / faults:67 minor 09-16 08:41:45.234:E / ActivityManager(286):0%404 / com.android.systemui:0%user 0%kernel 09-16 08:41:45.234:E / ActivityManager(286):0%446 / com.android.phone:0% user 0% kernel 09-16 08:41:45.234:E / ActivityManager(286):4.9%TOTAL:2.1%用户2.6%内核0.1%softirq 09-16 08:41:45.234:E / ActivityManager(286):CPU使用率1502ms到2050ms之后:09-16 08:41:45.234:E / ActivityManager(286):5.5%286 / system_server:3.7%用户1.8%内核/故障:2次要09-16 08:41:45.234:E / ActivityManager( 286):9.2%303 / ActivityManager:5.5%用户3.7%内核09-16 08:41:45.234:E / ActivityManager(286):7.2%TOTAL:7.2%用户0%内核09-16 08:41:45.375: D / dalvikvm(286):GC_FOR_ALLOC释放1595K,57%免费5837K / 13296K,暂停75ms,总计76ms 09-16 08:41:45.505:D / dalvikvm(286):GC_FOR_ALLOC释放1034K,59%免费5464K / 13296K,暂停72毫秒,总计73毫秒09-16 08:41:45.515:我/编舞(286):跳过66帧!应用程序可能在其主线程上做了太多工作 .

我的问题是,使用以单例模式实现的模态对话框,这对我来说非常有效 . 它会暂停Activity上的指令指针并继续在Handlter线程下显示Dialog(你可以在singleton类中看到这个) . 但我不知道为什么当我按下“后退按钮”它会崩溃我的应用程序并冻结它 . 希望有人可以帮助我 . :(

2 回答

  • 1

    不要那样做!一旦停止UI线程,Android系统将向用户显示一个对话框,试图强制关闭!!

    但是,使用托管对话框http://developer.android.com/guide/topics/ui/dialogs.html已被弃用

  • 0

    我想我不能做我想做的事 . 这是基于Android的工作原理 .

    使下面的代码无效

    synchronized( synchObject )
            {
               try
               {
                  synchObject.wait();
               }
    

    现在我只使用通信器模式来处理事件和对话框的结果 .

    非常感谢 .

相关问题