【发布时间】: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