【问题标题】:Deliver result from single service to multiple fragments将结果从单个服务传递到多个片段
【发布时间】:2015-04-02 06:36:26
【问题描述】:

我的 Activity 中有ViewPager,其中每个页面都包含很少的片段。现在,一旦加载片段,我就会调用一个服务,该服务的工作是从 web 服务中获取数据并使用ResultReceiver 将结果传递给特定片段班级。为了更清楚:

FragmentA----->calls FetchDataService()

FragmentB----->calls FetchDataService()

现在FetchDataService 没有将结果传递到正确的片段,而是我在FragmentB 接收结果,因为它最后调用了FetchDataService。在每个片段中获得正确结果的最佳方法是什么。

【问题讨论】:

  • 在片段中使用本地广播接收器,也许它可以工作..
  • FetchDataService 需要多长时间获取一次数据——换句话说,Web 服务端的数据是否定期变化? FragmentA、FragmentB 等也要求 FetchDataService 获取相同的数据还是每个 Fragment 需要不同的数据?
  • 每个片段需要不同的数据,数据被提取一次并存储在 SQLite 数据库中。如果网络服务端的数据发生变化,它会再次获取新内容@Squonk
  • Activity 获取所有需要的数据并将其存储在 SQLite 数据库中是否更有意义,然后每个 Fragment 可以简单地执行自己的本地数据库查询来获取数据他们需要吗?
  • 是的,但我有多个请求从 Web 服务获取数据。如何一次获取所有数据?你知道怎么做吗? @Squonk

标签: android android-fragments broadcastreceiver android-broadcast intentservice


【解决方案1】:

不要让 Fragments 轮询数据,让他们收听广播。 当 FetchDataService 从服务器接收到数据时,它必须发送带有数据的广播。每个片段都可以注册一个具有正确 intentFilter 的广播接收器来监听 FetchDataService 的广播。

// Example function to send data with a broadcast
sendData(Context context, Data data) {
    Intent intent = new Intent();
    intent.setAction("fetchedData");
    intent.putExtra("data", data);
    context.sendBroadcast(intent);
}

// Register your reciever to listen to the correct actions (in this case "fetchedData")
BroadcastReceiver broadcastReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("fetchedData") // use same string here as in sender
context.registerReceiver(broadcastReceiver, intentFilter);

// You can create multiple receivers (one for each fragment for example)
public class MyBroadcastReceiver extends android.content.BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        if (action.equals("fetchedData")) {
            Data data = (Data)intent.getSerializableExtra("data");
            // Do something with data
        }
    }
}

我会从字符串“fetchedData”和“data”中创建常量以防止拼写错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多