0

我正在处理的应用程序有一个包含三个片段的活动。每个片段都需要显示一些从 IntentService 接收到的数据。

片段 1 - 图标、名称和描述 片段 2 - 文章列表 片段 3 - 项目列表

public class Activity extends SherlockFragmentActivity implements Actionbar.Tablistener
{

    public void onCreate(..) {

        ....
        performSearch();
        setupTabs(); // 3 tabs are setup, their clicks and swipes init'ed
        ...

    }

    @Override
    public void onResume() { 

      IntentFilter intentFilter = new IntentFilter(SearchRequestReceiver.ACTION);
      intentFilter.addCategory(Intent.CATEGORY_DEFAULT);
      searchRequestReceiver = new SearchRequestReceiver(this);
      registerReceiver(searchRequestReceiver, intentFilter);

    }

    @Override 
    public void onPause() {

      unregisterReceivers();

    }
    ...

    public void performSearch() {

        Intent intent = new Intent(this, SearchRequest.class);
        intent.putExtra("searchTerm", this.searchTerm); // declared and initialised earlier
        startService(intent);
    }

    ...
}

我将这些数据从我的接收器推送到我的片段的最佳方式是什么,或者我以错误的方式接近这个?我没有使用 AsyncTasks 是因为我想将我的服务与上下文分离,或者那是错误的决定?

4

2 回答 2

1

在这种情况下,EventBus 是最巧妙的解决方案之一。EventBusOtto都非常易于使用。

使用 Otto 的示例...

您的 IntentService

new Handler(Looper.getMainLooper()).post(new Runnable() {
   bus.post(new DataLoadCompleteEvent());
});

请注意使用 Otto 在 Android 的主线程上发布事件的必要性。在这种情况下, aDataLoadCompleteEvent可以包含您想要的任何内容。

你的片段

@Subscribe public void onLoad(DataLoadCompleteEvent event) {
    //Do stuff with event
}

只需确保您的 Fragments 在他们的总线上onResume()注册,并在他们的onPause().

于 2014-04-29T05:50:06.503 回答
0

我已经设法通过在我的片段中使用不同的接收器来使其工作,但这似乎是一个非常多的重复。

public class FragmentName extends SherlockFragment 
{

   private SearchRequestReceiver searchRequestReceiver;

   ..

   public class ServiceRequestReceiver extends BroadcastReceiver
   {

        @Override
        public void onReceive(Context context, Intent intent) {

            ...

        }

   }

}

有没有更好的办法?

于 2014-04-27T13:40:23.833 回答