2014-12-03 109 views
4

即时错误信息是相当明显,我得到一个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 
    } 
} 

我如何可以调用从主线程重新创建(但代码有在收到意图时处理)?

回答

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 
    } 
} 
+0

this.recreate无法解析。但提到VarControl.ma.recreate()做到了! 非常感谢,我正在寻找! – 2014-12-03 10:39:55

+0

是的,我编辑不久之后,如果你写this.recreate(),'this'是指Runnable。你可以忽略'this',它将使用唯一的上下文,这里重新创建有意义,你的活动,或指定MainActivity.this.recreate(); – 2014-12-03 10:44:18

0

制作两个线程均可访问的列表。使用同步或类似的东西来保护它。无论何时收到意图,都会将带适配代码的Runnable添加到列表中。 在主线程中定期检查列表是否非空。如果它不是空的,从列表中弹出第一个Runnable并运行它。那样做直到列表为空。

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

+0

感谢您的答复,我将如何检查,定期间隔列表?在无尽的Thread.sleep循环中获取主线程对我来说真的不是一个选项..... – 2014-12-03 10:24:12

相关问题