ProgressDialog.setMessage(String) 不会抛出 IllegalStateException

ProgressDialog.setMessage(String) doesn't throw IllegalStateException

我在下面的代码中从工作线程调用 Progressdialog.setMessage(String) 方法,但是 Android 没有抛出 IllegalStateException 应该说 "java.lang.IllegalStateException: Calling View methods on another thread than the UI thread" 因为我正在修改 UI 来自 UI 线程之外,这在 Android.

中被禁止

这是我的工作线程的可运行对象作为内部 class:

public class HostOnHoldRunnable implements Runnable {

    @Override
    public void run() {
            hostOnHoldDialog.setMessage("Game is on hold because the host paused the app (" + currentTimeLeftForHostOnHoldTimeOut / 1000 + ")");
        }
    }
}

注意:hostOnHoldDialog 是我的 Activity 的 ProgressDialog 成员。

而不是抛出 IllegalStateException,android 只是不根据消息更新 UI。

这是一个错误吗?

如果我在 Runnable 中使用 runOnUiThread,一切正常,例如

public class HostOnHoldRunnable implements Runnable {

    @Override
    public void run() {
         runOnUiThread(new Runnable() { 
             public void run() { 
            hostOnHoldDialog.setMessage("Game is on hold because the" + 
            " host paused the app (" + 
            currentTimeLeftForHostOnHoldTimeOut / 1000 + ")");

             }
         });
    }
}

尝试使用

Handler handler = new Handler();
    handler.post(new Runnable() {

        @Override
        public void run() {
            hostOnHoldDialog.setMessage("Game is on hold because the host paused the app (" + currentTimeLeftForHostOnHoldTimeOut / 1000 + ")");
        }
    });

嗯,你看到 HandlerLooper 一起工作 运行ning 消息,处理程序 运行s 在 UI 线程上,每个视图都有一个附加到它的处理程序,使它能够在 UI 线程上 post methods/functions,任何新创建的线程想要 运行 消息或 运行 在 UI 线程必须调用一个 Handler 或 Looper.prepare() ,稍后将实现该处理程序。在多线程应用程序中,使用 Handler().post() 或 Handler().postDelayed() 或 View.post() 或 View.postDelayed( ) 或 Context.getMainLooper() 都是帮助你在 UI 线程上 post 的函数,所以如果你用这种方法调用方法,你不会得到异常。所以这里没有问题或错误,只需阅读有关 Looper、Hanlder 和 View

的文档的几行