从后台线程中解除ProgressDialog时,为什么没有抛出异常?

时间:2011-11-30 11:27:37

标签: android

我知道当我尝试在后台线程上显示ProgressDialog时会抛出异常Can't create handler inside thread that has not called Looper.prepare()

因为我们正在尝试从后台线程修改UI。但是当我们在后台线程中忽略该对话框时,不会抛出任何异常。为什么我们在后台线程中关闭对话框时没有抛出异常,因为我们也是后台线程中的modifyng UI。

由于

2 个答案:

答案 0 :(得分:5)

这是Dialog的dismiss()方法的代码,显示了为什么没有抛出异常和解散的原因:

/**
 * Dismiss this dialog, removing it from the screen. This method can be
 * invoked safely from any thread.  Note that you should not override this
 * method to do cleanup when the dialog is dismissed, instead implement
 * that in {@link #onStop}.
 */
public void dismiss() {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(mDismissAction);
    } else {
        mDismissAction.run();
    }
}

答案 1 :(得分:2)

这是Dialog类中的.dismiss()方法的实现,如2.2中所示:

 public void dismiss() {
         if (Thread.currentThread() != mUiThread) {
             mHandler.post(mDismissAction);
         } else {
             mDismissAction.run();
         }
     }

如您所见,它会检查您是否尝试从UI线程调用它。如果你这样做,它就会解雇自己。但是如果你从另一个线程中解雇它,它会通过在UI线程上创建的Handler来处理这个动作,因此它将处理UI线程上的dismiss动作。