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