簡體   English   中英

從廣播接收機調用的更新列表視圖的方法無效

[英]Method to update list view called from broadcast receiver does not work

在實現廣播接收器時遇到了一個問題。

我在Fragment類中具有以下功能:

public void reloadMessages() {
    List<SmsList> values = smsToSmsList(getAllSms());
    mPostAdapter.clear();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        mPostAdapter.addAll(values);
    } else {
        for (SmsList smsList : values) {
            mPostAdapter.add(smsList);
        }
    }
    mPostAdapter.notifyDataSetChanged();
    Log.d(null, "reloadMessages");
}

我從廣播接收器調用它:

private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

                mainFragment.reloadMessages();

        Log.d("myactivity", "broadcast received");
    }
};

使用調試器進行分析表明,此函數已正確調用,但沒有任何反應。 我執行了一個測試,並從onclick函數中調用了該函數,它可以正常工作。

問題是什么?

我嘗試使用runOnUiThread()和Handler,但沒有任何變化。

在API級別11之前,您無法在onReceive()方法中執行任何異步操作,因為一旦完成onReceive()方法,便允許Android系統回收該組件。 如果您的操作可能長期運行,則應改為觸發服務。

從Android API 11開始,您可以調用goAsync()方法。 此方法返回PendingResult類型的對象。 在您對此對象調用PendingResult.finish()之前,Android系統會將接收器視為處於活動狀態。 使用此選項,您可以在接收器中觸發異步處理。

您需要做的是啟動一個服務,該服務將在事件廣播時執行以下操作:

new BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) { 
    Intent intent = new Intent(context, CustomService.class);
    context.startService(intent);
  }
} 

編輯:

您可能缺少有關此事的信息,例如正確聲明了xml組件以及有關廣播接收和服務的權限。

我強烈建議您按照教程進行操作,因為它將使您了解這些工作原理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM