【问题标题】:Android Modal Dialog implemented Singleton patternAndroid 模态对话框实现单例模式
【发布时间】:2014-09-16 12:14:58
【问题描述】:

_________________我的单例模式对话框类_________________

⁃   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

________________我如何在我的活动课上称呼它_____________

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}}} - 窗口{41995bf0 u0 com.example.esf_templatea/com.templatea.MainActivity}。自事件以来已 5008.4 毫秒,自等待开始以来已 5006.8 毫秒。原因:等待,因为焦点窗口尚未完成对先前传递给它的输入事件的处理。 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 freed 3213K, 50% free 6742K/13296K, paused 4ms+10ms,总共113ms 09-16 08:41:45.234: E/ActivityManager(286): com.emplatea (com.templatea/com.templatea.MainActivity) 中的 ANR 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% 内核/故障:67 次 09-16 08:41:45.234: E/ActivityManager(286): 0% 404/com.android.systemui: 0% 用户 + 0% 内核 09-16 08:41:45.234: E/ActivityManager(286): 0% 446/com.android.phone: 0% 用户 + 0% 内核 09-16 08:41:45.234: E/ActivityManager(286): 4.9% TOTAL: 2.1% user + 2.6% kernel + 0.1% softirq 09-16 08:41:45.234:E/ActivityManager(286):CPU 使用率从 1502 毫秒到 2050 毫秒后: 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% 总计: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,暂停 72ms,总共 73ms 09-16 08:41:45.515:I/Choreographer(286):跳过 66 帧!应用程序可能在其主线程上做了太多工作。

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

【问题讨论】:

  • 请添加堆栈跟踪(LogCat)。
  • 做这种事是自找麻烦,请不要与androd框架作对

标签: android multithreading dialog modal-dialog singleton


【解决方案1】:

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

改用托管对话框http://developer.android.com/guide/topics/ui/dialogs.html 已被弃用,虽然

【讨论】:

    【解决方案2】:

    我想我不能做我想做的事。这基于 Android 的工作方式。

    禁用下面的代码

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

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

    非常感谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多