Android错误:必须从主线程调用recreate()

时间:2014-12-03 10:16:04

标签: java android

我收到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(但代码必须在接收意图时处理)?

2 个答案:

答案 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并运行它。这样做直到列表为空。

这通常是处理从一个线程到另一个线程的代码传递的好方法。