2015-09-01 57 views
-1

我搜索了很多,但沒有找到解決以下問題。Android - LocalBroadcast

語境:

  • 我使用AsyncHttpResponseHandler對象來處理我所有的web服務 響應
  • 如果我從WS特定錯誤代碼,我想表明一個警告對話框(無論活動當前顯示)
  • 我認爲使用LocalBroadcastManager將是一個很好的解決方案,因爲HTTP處理程序不知道當前顯示的活動

問題: 執行完所有似乎需要的工作後,我的意圖從異步處理程序發送不會收到。

附加說明:

  • ApplicationContext需要保存在我的StaticItems 類,它包含了所有的靜態數據,我需要在我的app.It是通過從應用
  • 繼承的自定義類設置如果我從活動中廣播了意圖,則會觸發OnReceive事件

我事先感謝您提供任何幫助。

乾杯!

下面是我的一些代碼片段:

在HTTP處理程序

public class AsyncResponseHandler extends AsyncHttpResponseHandler { 
    @Override 
    public void onSuccess(int statusCode, Header[] headers, byte[] response) { 
     if(response != null && response.length > 0) { 
      CrvData data = JsonHelper.getCrvData(new String(response)); 
      String code = data.getErrorCode(); 
      if (!TextUtils.isEmpty(code) && code.equals(StaticItems.C_WS_OBSOLETE_VERSION_ERROR)) { 
       Intent intent = new Intent(); 
       intent.setAction(StaticItems.BROADCAST_INTENT_MESSAGE); 
       intent.addCategory(Intent.CATEGORY_DEFAULT); 
       intent.setData(Uri.parse(data.getValue())); 
      LocalBroadcastManager.getInstance(StaticItems.applicationContext).sendBroadcast(intent); 
     } 
    } 
} 

根系活力我用我的所有活動的代碼代碼:

public class MainActivity extends Activity { 

    /** 
    * The local broadcast receiver 
    */ 
    protected MyBroadcastReceiver mMessageReceiver = new MyBroadcastReceiver(); 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     // register 
     IntentFilter filter = new IntentFilter(); 
     filter.addCategory(Intent.CATEGORY_DEFAULT); 
     filter.addAction(StaticItems.BROADCAST_INTENT_MESSAGE); 
     LocalBroadcastManager.getInstance(StaticItems.applicationContext).registerReceiver(mMessageReceiver, filter); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     // Unregister 
     LocalBroadcastManager.getInstance(StaticItems.applicationContext).unregisterReceiver(mMessageReceiver); 
    } 
} 

接收器

public class MyBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(context); 
     builder.setInverseBackgroundForced(true) 
       .setNegativeButton(context.getResources().getString(R.string.dlg_no), new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
        } 
       }) 
       .setIcon(R.drawable.ic_dialog_alert_holo_light) 
       .setMessage(R.string.dlg_app_is_obsolete) 
       .setPositiveButton(context.getResources().getString(R.string.dlg_yes), new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         context.startActivity(intent); 
        } 
       }); 
     builder.show(); 
    } 
} 
+0

發送廣播時,MainActivity仍在運行嗎? – Emil

+0

你考慮過[EventBus](https://github.com/greenrobot/EventBus)嗎? – Knossos

+0

@Boss由於當前顯示的活動是一個MainActivity(就像我的應用程序中的所有活動),是的,它是 – MarsNoToshi

回答

0

OK刪除addCategory()所以......我想通了,因爲該行的意圖沒有收到: intent.setData(Uri.parse(data.getValue()));

而作爲@mvai指出,該對話框不能從應用程序上下文中顯示。我設法通過在我的應用程序類中引用它來獲取當前活動。 (我檢查確定沒有任何內存泄漏)

0

我的猜測是,context您使用的不是活動情境,因此不能用於創建對話框。

也就是說,傳遞給onReceive在這種情況下,背景應該是你的應用環境,StaticItems.applicationContext,這是很好的顯示對話框。

如果是這種情況,您應該以某種方式重新安排您的代碼,以確保傳遞活動上下文而不是應用程序。

+0

我明白你的猜測,但事情並沒有達到onReceive內部的斷點。因此,我不認爲這是問題 – MarsNoToshi

+0

所以你的問題應該是:爲什麼當從活動調用LocalBroadcastManager.getInstance(appContext).sendBroadcast(intent)'時工作,而從另一個類中調用時不起作用。實際上我沒有發現兩者之間的區別,所以應該在某處出現另一個錯誤(onSuccess中的'if'子句?)。至於沒有顯示的對話框,我很確定它是一個'Context'問題。有據可查的是,對話框構建器只能用於活動上下文。 – natario

+0

謝謝你指點我正確的方向。我沒有做過複製/粘貼。看了差異後,我發現issus(回答如下) – MarsNoToshi

0

IntentFilter

解決了here

+0

感謝您的鏈接,但它也不工作。正如OP在評論中提到的那樣:IntentFilter實例和Intent實例應該具有相同的類別。我修改代碼以使用IntentFilter的相同類別,並且它工作得很好._ – MarsNoToshi

1

我有類似的問題,由於某種原因,你不能通過LocalBroadcastManager返回的Intent返回setData(..),當我把我的URI放入額外的數據時,它開始工作....可能是一個錯誤?