我收到了一个Android错误,尽管错误信息很明显,但我还是想不出如何使它正常工作。
错误信息是:
java.lang.IllegalStateException: Must be called from main thread
at android.app.Activity.recreate(Activity.java:4193)在我的应用程序中,会发送一个通知来注销用户(当他的令牌过期时)。
在较早的Android版本中,我这样做没有问题,但是在SDK 11和更高版本中,我必须使用recreate()方法。我得到的错误是,必须从主线程调用它。
我将recreate()语句移到MainActivity类中,当我从IntentService调用该方法时,它不起作用。我还是会犯同样的错误。消息传递部分工作正常,只需处理注销消息就会导致此错误。
以下是一些片段:
内部GcmIntentService.java
if (logout!=null) {
VarControl.ma.logout();
}内部MainActivity.java
public void logout() {
deleteToken();
closeWebView();
restartApp();
}
public void restartApp() {
if (Build.VERSION.SDK_INT >= 11) {
this.recreate(); // THE ERROR OCCURS HERE
}
else{
//left out this part because its not relevant
}
}如何从主线程调用重新创建(但代码必须在接收到意图时处理)?
发布于 2014-12-03 10:35:39
如果要在主线程上运行sthg,仍然可以:
public void restartApp() {
if (Build.VERSION.SDK_INT >= 11) {
runOnUiThread(new Runnable() {
@Override
public void run() {
recreate();
}
});
}
else{
//left out this part because its not relevant
}
}发布于 2014-12-03 10:19:31
列出两个线程都可以访问的列表。使用同步或诸如此类的方法来保护它。每当收到意图时,向列表中添加一个具有合适代码的可运行代码。在主线程中,定期检查列表是否为非空的。如果它不是空的,从列表中弹出第一个Runnable并运行它。这样做,直到列表为空。
这通常是处理代码从一个线程传递到另一个线程的好方法。
https://stackoverflow.com/questions/27268979
复制相似问题