android - 广播接收器根据从服务到片段的改造 2 调用的响应发送广播的问题
问题描述
这是我发送广播的代码,我在这里对本地数据库表进行更改,然后发送广播:
for (int i = 0; i < forms.length(); i++) {
retrofit2.Call<SubmitFormResponse> call;
call = RetrofitClass.getInstance().getWebRequestsInstance().formSubmitWitoutImages(tinyDB.getString(Constants.token), bodyRequest);
call.enqueue(new Callback<SubmitFormResponse>() {
@Override
public void onResponse(Call<SubmitFormResponse> call, Response<SubmitFormResponse> response) {
if (response.isSuccessful()) {
formIds.add(formId);
QueueModel model = databaseHandler.getQueueIncidenceStateOnIncidenceID(task_id);
model.setNumSubmitted(++numSubmitted);
databaseHandler.updateQueuedIncidenceStateOnRunId(model);
// updateUI.updateUI(databaseHandler.getAllQueuedIncidences());
UploaderService.this.sendBroadcast(new Intent(BROADCAST_ACTION));
}
}
@Override
public void onFailure(Call<SubmitFormResponse> call, Throwable t) {
t.printStackTrace();
}
});
}
收到广播后,我从更新的数据库表中获取列表,然后在片段中使用 notifyDataSetChanged() 重新初始化适配器。下面是接收广播的代码:
@Override
public void onReceive(Context context, Intent intent) {
Log.e("CALLED", "Intent passed");
// pullToRefresh.setRefreshing(true);
if (adapter != null) {
list = databaseHandler.getAllQueuedIncidences();
if (list.size() == 0) {
tvNoPendingUploads.setVisibility(View.VISIBLE);
rvPendingUploads.setVisibility(View.GONE);
} else {
tvNoPendingUploads.setVisibility(View.GONE);
rvPendingUploads.setVisibility(View.VISIBLE);
adapter.setItems(list);
adapter.notifyDataSetChanged();
}
} else {
list = databaseHandler.getAllQueuedIncidences();
Log.e("Up", databaseHandler.getAllQueuedIncidences().size() + "");
if (list.size() == 0) {
tvNoPendingUploads.setVisibility(View.VISIBLE);
rvPendingUploads.setVisibility(View.GONE);
} else {
tvNoPendingUploads.setVisibility(View.GONE);
rvPendingUploads.setVisibility(View.VISIBLE);
adapter = new AdapterPendingUploads(list, getActivity());
rvPendingUploads.setLayoutManager(manager);
rvPendingUploads.setAdapter(adapter);
}
}
// pullToRefresh.setRefreshing(false);
}
};
接收者在 onCreateView() 中注册,在 onDestroy() 中取消注册:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.fragment_pending_uploads, container, false);
init(view);
clickListeners();
getActivity().registerReceiver(broadcastReceiver, new IntentFilter(
BROADCAST_ACTION));
return view;
}
@Override
public void onDestroy() {
getActivity().unregisterReceiver(broadcastReceiver);
super.onDestroy();
}
sendBroadcast() 不会立即调用 BroadcastReceiver 的 onRecieve() ,而是等待循环结束,调用 sendBroadcast() n 次,最后调用 onRecieve() n 次,不断地。我需要在点击每个 API 后更新 UI。sendBroadcast() 和 onRecieve() 应该在点击每个 API 后同时调用。请告诉我我做错了什么?
[编辑] 使用 EventBus 而不是 BroadcastReciever 解决了这个问题,但我仍然很好奇为什么 BroadcastReciever 会出现这种行为?
解决方案
您可以尝试使用 EventBus 库。
推荐阅读
- ruby - 如何从 ruby 脚本更改终端中的目录?
- apache-storm - 拓扑只是在远程模式下在 Storm 上闲置
- mysql - 有没有办法用条件创建外键约束
- php - Laravel 中本地和生产的单一 Redis 配置?
- c# - Entity Framework 的 StateManager 中很少有对象消耗大量 RAM
- jupyter-notebook - 使用 JWT 令牌的 Keycloak JupyterHub 自动登录
- django - 如何将 jquery 属性从基本模板加载到扩展模板,jquery 包含在基本模板中
- java - HttpURLConnection URI 不能为空
- excel - 在powershell中从excel文件中删除密码
- notepad++ - 如何删除在列的特定部分包含重复文本的行?