【问题标题】:Updating Fragments from an IntentService从 IntentService 更新片段
【发布时间】:2014-04-27 07:45:49
【问题描述】:

我正在处理的应用程序有一个包含三个片段的活动。每个片段都需要显示一些从 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 是因为我想将我的服务从上下文中解耦出来,或者这是一个错误的决定?

【问题讨论】:

    标签: android android-fragments android-intentservice


    【解决方案1】:

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

    使用 Otto 的示例...

    您的 IntentService

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

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

    你的片段

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

    只需确保您的 Fragments 在其onResume() 中注册总线,并在其onPause() 中取消注册。

    【讨论】:

      【解决方案2】:

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

      public class FragmentName extends SherlockFragment 
      {
      
         private SearchRequestReceiver searchRequestReceiver;
      
         ..
      
         public class ServiceRequestReceiver extends BroadcastReceiver
         {
      
              @Override
              public void onReceive(Context context, Intent intent) {
      
                  ...
      
              }
      
         }
      
      }
      

      有没有更好的办法?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-08
        • 2021-07-27
        • 1970-01-01
        相关资源
        最近更新 更多