【问题标题】:Issue with Broadcast Receiver sending broadcast on response of Retrofit 2 call from a service to a fragment广播接收器根据从服务到片段的改造 2 调用的响应发送广播的问题
【发布时间】:2019-12-10 18:25:24
【问题描述】:

这是我发送广播的代码,我在这里对本地数据库表进行更改,然后发送广播:

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 会出现这种行为?

【问题讨论】:

    标签: android android-fragments service broadcastreceiver retrofit2


    【解决方案1】:

    您可以尝试使用 EventBus 库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 2014-04-27
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多