2014-07-12 137 views
0

我有這樣的服務延伸IntentService。清晰度上IntentService

public class RefreshService extends IntentService { 

static final String TAG = "RefreshService"; 

public RefreshService() { 
    super(TAG); 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.d(TAG, "onCreated"); 
} 



@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.d(TAG, "onDestroyed"); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
protected void onHandleIntent(Intent intent) { 

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    final String username = prefs.getString("username", "").trim(); 
    final String password = prefs.getString("password", "").trim(); 

    Log.d(TAG, "onDestroyeds"); 

    if (TextUtils.isEmpty(username) || (TextUtils.isEmpty(password))){ 
     Toast.makeText(this, "Please update your username and password", Toast.LENGTH_LONG).show(); 
     return; 
    } 

    // here code for fetching data and inserting into db. 

} 

}

當設置丟失,而不是舉杯消息是表演,我碰到下面的錯誤。

07-12 18:28:33.125 2961-2961/com.example.krishna.yamba I/menu_item_selected﹕ [0,Refresh] 
07-12 18:28:33.143 2961-2961/com.example.krishna.yamba D/RefreshService﹕ onCreated 
07-12 18:28:33.147 2961-3637/com.example.krishna.yamba D/RefreshService﹕ onDestroyeds 
07-12 18:28:33.147 2961-3637/com.example.krishna.yamba D/RefreshService﹕ onDestroyeds 
07-12 18:28:33.181 2961-2961/com.example.krishna.yamba D/RefreshService﹕ onDestroyed 
07-12 18:28:33.197 2961-3637/com.example.krishna.yamba W/MessageQueue﹕ Handler (android.view.ViewRootImpl$ViewRootHandler) {38f6505f} sending message to a Handler on a dead thread 
    java.lang.IllegalStateException: Handler (android.view.ViewRootImpl$ViewRootHandler) {38f6505f} sending message to a Handler on a dead thread 
      at android.os.MessageQueue.enqueueMessage(MessageQueue.java:325) 
      at android.os.Handler.enqueueMessage(Handler.java:631) 
      at android.os.Handler.sendMessageAtTime(Handler.java:600) 
      at android.os.Handler.sendMessageDelayed(Handler.java:570) 
      at android.os.Handler.post(Handler.java:326) 
      at android.view.ViewRootImpl.loadSystemProperties(ViewRootImpl.java:5413) 
      at android.view.ViewRootImpl.<init>(ViewRootImpl.java:378) 
      at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:253) 
      at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 
      at android.widget.Toast$TN.handleShow(Toast.java:414) 
      at android.widget.Toast$TN$1.run(Toast.java:322) 
      at android.os.Handler.handleCallback(Handler.java:738) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.os.HandlerThread.run(HandlerThread.java:61) 

我假設以下

  1. 在onHandleIntent方法中的代碼是在不同的線程運行都是如此。
  2. 因此,在這裏做一些密集的任務是很好的。 (在這種情況下,我只是提取和更新db)

當設置正確時,一切正常。然後把取消和更新敬酒信息不應該是一個問題吧?

如何把敬酒消息時,設置爲空白?

+0

,以及如何使用該服務什麼時候?它是否只在應用程序內部的用戶啓動時運行?還是可以在後臺任意啓動(例如通過AlarmManager)? – Karakuri

+0

實際上都是兩種方式 –

回答

2

IntentService在單獨的線程上執行它的onHandleIntent。另一方面,Toast在主/ UI線程上運行。爲了在IntentService顯示Toast,你需要做的是這樣的:

new Handler(Looper.getMainLooper()).post(new Runnable() {   
    @Override 
    public void run() { 
     Toast.makeText(RefreshService.this, "Toast msg here", Toast.LENGTH_LONG).show(); 
    } 
}); 
3

在onHandleIntent方法中的代碼是在不同的線程中運行。

正確。

因此它是好的,在這裏做一些密集型任務。 (在這種情況下,我只是讀取和更新db)

正確。

然後把取消和更新的Toast消息相比,不應該是一個問題吧?

不,因爲您不能從後臺線程中提取Toast。事實上,這是錯誤告訴你的。

如何把敬酒消息時,設置爲空白?

正確的答案是不使用Toast。這是告訴用戶錯誤情況的第二差解決方案(最糟糕的是根本不試圖告訴用戶)。無法保證在Toast可讀的時間點,用戶將恰好看到屏幕,因此用戶可能會錯過信息。使用crouton什麼的。

無論如何,你需要安排讓主應用程序線程以某種方式更新UI ...如果你的UI恰好是在前臺。現代化的解決方案通常涉及某種事件總線。主要有三個事件總線實現在這個時候:

,我鏈接到示例應用程序都展示了UI或Notification模式,如果我們碰巧在前臺,我們更新用戶界面,或者我們提出一個Notification以讓用戶知道事件,如果我們做在前臺沒有我們的用戶界面。

+1

爲EventBus投票。由於LBM在同一個進程中,序列化數據對象是毫無意義的,並且,假設沒有任何變化,Otto不會簡單地處理線程邊界。我們目前正在審查我們的背景最佳實踐,所以我可能需要再看看Otto,但LBM正在失寵(無論如何,我們的團隊)。到目前爲止,除了將特定的請求與特定的Fractivity實例相關聯以外,EventBus一直很棒。但我離題了。 –

+0

真的很整齊,詳細的答案。但爲了幫助我理解調試。你說日誌是解釋的東西。但我無法確切地知道。請你能指出日誌中的具體內容。 –

+0

@Napster:「你說日誌是解釋的東西」 - 不,我沒有。單詞「日誌」不會出現在我的答案中。 – CommonsWare