我知道当我尝试在后台线程上显示ProgressDialog时会抛出异常Can't create handler inside thread that has not called Looper.prepare()
,
因为我们正在尝试从后台线程修改UI。但是当我们在后台线程中忽略该对话框时,不会抛出任何异常。为什么我们在后台线程中关闭对话框时没有抛出异常,因为我们也是后台线程中的modifyng UI。
由于
答案 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动作。