2014-12-03 61 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

相關問題