Android阻塞式確認Dialog-Loop實現方式
阿新 • • 發佈:2019-01-25
之前一直感覺Android的對話方塊設計好悲催,由於Android的Dialog是非阻塞的方式,
每次彈出一個輸入框或確認操作框都需要實現回撥介面和處理回撥方法,滿滿的殺雞用牛刀的感覺.
我只是需要一個使用者點選確認或取消的狀態而已以及只需要獲得輸入的引數而已,用監聽好麻煩不說,複用也很複雜.
所以查看了網上的一些方法,做了一個工具類,這個工具類的原理是:
系統顯示一個對話方塊後,利用Loop.loop()方法,使主執行緒阻塞,
在使用者點選按鈕後丟擲一個RuntimeException異常,大家知道這個異常時不用捕獲也不用丟擲的,
這樣就直接強制終止了Loop的狀態.主執行緒繼續,但是這時候輸入結果已經出來了.
也就達到了我們想要的效果,下面是確認對話方塊的簡單實現.在呼叫時直接使用
boolean isOk = ConfirmDialog.showComfirmDialog(MainActivity.this,"提示","你好嗎?");
if(isOk){...}
package com.example.dialogtest; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Handler; import android.os.Looper; import android.os.Message; public class ConfirmDialog { int dialogResult; public static Handler mHandler; public Context context; public static boolean showComfirmDialog(Activity context, String title,String msg) { mHandler = new MyHandler(); return new ConfirmDialog(context, title,msg).getResult() == 1; } public ConfirmDialog(Activity context, String title,String msg) { //顯示Dialog; AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context); dialogBuilder.setPositiveButton("確定", new DialogButtonOnClick(1)); dialogBuilder.setNegativeButton("取消", new DialogButtonOnClick(0)); dialogBuilder.setTitle(title).setMessage(msg).create().show(); //系統執行緒會阻塞 try {Looper.loop();}catch (Exception e) {} } public int getResult() {return dialogResult;} private static class MyHandler extends Handler{ public void handleMessage(Message mesg) { throw new RuntimeException(); } } private final class DialogButtonOnClick implements OnClickListener{ int type; public DialogButtonOnClick(int type){ this.type = type; } /** * 使用者點選確定或取消按鈕後,設定點選按鈕,傳送訊息; * mHandler收到訊息後丟擲RuntimeException()異常; * 阻塞會消失,主執行緒繼續執行 */ public void onClick(DialogInterface dialog, int which) { ConfirmDialog.this.dialogResult = type; Message m = mHandler.obtainMessage(); mHandler.sendMessage(m); } } }
大家可以根據需要改造,只要改變顯示的Dialog列別和樣式就行了.