首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android错误:必须从主线程调用recreate()

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

Stack Overflow用户
提问于 2014-12-03 10:16:03
回答 2查看 9K关注 0票数 8

我收到了一个Android错误,尽管错误信息很明显,但我还是想不出如何使它正常工作。

错误信息是:

代码语言:javascript
复制
 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

代码语言:javascript
复制
if (logout!=null) {
    VarControl.ma.logout();
}

内部MainActivity.java

代码语言:javascript
复制
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
    }
}

如何从主线程调用重新创建(但代码必须在接收到意图时处理)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-03 10:35:39

如果要在主线程上运行sthg,仍然可以:

代码语言:javascript
复制
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
    }
}
票数 7
EN

Stack Overflow用户

发布于 2014-12-03 10:19:31

列出两个线程都可以访问的列表。使用同步或诸如此类的方法来保护它。每当收到意图时,向列表中添加一个具有合适代码的可运行代码。在主线程中,定期检查列表是否为非空的。如果它不是空的,从列表中弹出第一个Runnable并运行它。这样做,直到列表为空。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27268979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档