有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我遇到了一个Android错误,尽管错误信息非常明显,但我不知道如何使它正常工作

错误消息是:

 java.lang.IllegalStateException: Must be called from main thread
        at 安卓.app.Activity.recreate(Activity.java:4193)

在我的应用程序中,会向用户发送注销通知(当其令牌过期时)

在旧的Android版本上,我这样做没有问题,但是从SDK 11和更高版本开始,我必须使用recreate()方法。我得到的错误是必须从主线程调用它

我将recreate()语句移动到MainActivity类,当我从IntentService调用该方法时,这不起作用。我仍然会犯同样的错误。消息传递部分工作正常,只是注销消息的处理导致了此错误

以下是一些片段:

在GCMinentService内部。爪哇

if (logout!=null) {
    VarControl.ma.logout();
}

内部活动。爪哇

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) 个答案

  1. # 1 楼答案

    创建一个两个线程都可以访问的列表。使用synchronized或类似的方法保护它。每当收到意图时,将带有配件代码的Runnable添加到列表中。 在主线程中,定期检查列表是否为非空。如果它不是空的,从列表中弹出第一个Runnable并运行它。这样做直到列表为空

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

  2. # 2 楼答案

    如果要在主线程上运行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
        }
    }