ProgressDialog.setMessage(String)不会抛出IllegalStateException

时间:2015-08-07 23:39:17

标签: java android view illegalstateexception

我在以下代码中从一个工作线程调用Progressdialog.setMessage(String)方法,但Android不会抛出IllegalStateException,它应该说“java.lang.IllegalStateException:在除UI之外的另一个线程上调用View方法线程“因为我在UI线程外部修改UI,这在Android中是被禁止的。

这是我的工作线程作为内部类的runnable:

public class HostOnHoldRunnable implements Runnable {

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

注意:hostOnHoldDialog是我的活动的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 + ")");

             }
         });
    }
}

2 个答案:

答案 0 :(得分:0)

尝试使用

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 + ")");
        }
    });

答案 1 :(得分:0)

嗯,您看到HandlerLooper一起用于运行消息,Handler在UI线程上运行,每个View都附加了一个处理程序,使其能够在UI上发布方法/函数线程,任何想要运行消息或在UI线程上运行的新创建的线程必须调用一个Handler或Looper.prepare(),后者将执行该处理程序。在多线程应用程序中,使用Handler()。post()或Handler()。postDelayed()或View.post()或View.postDelayed()或Context.getMainLooper()都可以帮助您在UI线程上发布,因此如果使用此方法调用方法,则不会出现异常。所以这里没有问题或错误,只需阅读Looper,Hanlder和View上文档的几行