我收到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
}
}
如何从主线程调用recreate(但代码必须在接收意图时处理)?
答案 0 :(得分:4)
如果你想在主线程上运行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
}
}
答案 1 :(得分:0)
创建两个线程都可访问的列表。使用synchronized或类似的东西来保护它。每当收到Intent时,将一个带有拟合代码的Runnable添加到List中。 在主线程中检查列表是否定期非空。如果它不为空,则从列表中弹出第一个Runnable并运行它。这样做直到列表为空。
这通常是处理从一个线程到另一个线程的代码传递的好方法。