Android 如何在广播接收器的onReceive()中使用来自SQLite的数据更新片段UI

Android 如何在广播接收器的onReceive()中使用来自SQLite的数据更新片段UI,android,android-fragments,broadcastreceiver,android-sqlite,Android,Android Fragments,Broadcastreceiver,Android Sqlite,我有一个Firebase服务,当新通知出现并且应用程序在前台时,我使用LocalBroadcastManager发送广播,从SQLite获取数据并更新片段UI(Recycler视图)。 我已经交叉检查了一下,看看广播接收器是否真的在发送广播,因为我可以通过日志查看我添加到intent中的字符串extras。我有一个updateUI()方法,它将从SQLite获取结果并更新UI 我已经反复检查了updateUI()是否能够独立工作(如果我在onResume()中调用它,即使没有广播接收器) 然而,

我有一个Firebase服务,当新通知出现并且应用程序在前台时,我使用LocalBroadcastManager发送广播,从SQLite获取数据并更新片段UI(Recycler视图)。 我已经交叉检查了一下,看看广播接收器是否真的在发送广播,因为我可以通过日志查看我添加到intent中的字符串extras。我有一个updateUI()方法,它将从SQLite获取结果并更新UI

我已经反复检查了updateUI()是否能够独立工作(如果我在onResume()中调用它,即使没有广播接收器)

然而,我的问题是更新广播接收器的onReceive()中的UI似乎不起作用

下面是我的片段摘录以及我是如何实现它的

public class NoticeListFragment extends Fragment{


    @Override
    public void onResume() {
        super.onResume();
        updateUI(); //In case data changes

        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mNoticeBroadcastReceiver,
            new IntentFilter("com.ultrasamad.htmcinside.NEW_NOTICE"));

    }

    @Override
    public void onPause() {
        super.onPause();

        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mNoticeBroadcastReceiver);
    }

    BroadcastReceiver mNoticeBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //Check for intent filter
            if(intent.getAction().equals("com.ultrasamad.htmcinside.NEW_NOTICE")){
                //New notice has arrived, update UI
                String noticeTitle = intent.getStringExtra("message");
                Log.d(TAG, "Notice Title: " + noticeTitle);
                updateUI(); //Seems not to be working....
            }
        }
    };


    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {


        //Inflate layout for this fragment
        View rootView = inflater.inflate(R.layout.fragment_notice_list, container, false);

        recyclerView = (RecyclerView) rootView.findViewById(R.id.rv_recycler_view);
        recyclerView.setHasFixedSize(true);

        LinearLayoutManager linearManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(linearManager);

        updateUI();
        return rootView;
    }

    private void updateUI(){
        NoticeSource noticeSource = NoticeSource.get(getActivity());
        List<NoticeItem> notices = noticeSource.getNotices();

        if(mNoticeListAdapter == null){
            mNoticeListAdapter = new NoticeListAdapter(notices);
            recyclerView.setAdapter(mNoticeListAdapter);
        }else{

            mNoticeListAdapter.setNotices(notices);
            mNoticeListAdapter.notifyDataSetChanged();
        }

    }
}
适配器类

private class NoticeListAdapter extends RecyclerView.Adapter<NoticeViewHolder>{

    private List<NoticeItem> listItems;

    private NoticeListAdapter(List<NoticeItem> data) {
        this.listItems = data;
    }


    @Override
    public NoticeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.notice_lists_card, parent, false);
        return new NoticeViewHolder(view);
    }

    @Override
    public void onBindViewHolder(NoticeViewHolder holder, int position){

        final NoticeItem noticeItem = listItems.get(position);
        holder.bindNotice(noticeItem);

    }

    @Override
    public int getItemCount() {
        return listItems.size();
    }

    private void setNotices(List<NoticeItem> notices){
            listItems = notices;
    }
}
私有类NoticeListAdapter扩展了RecyclerView.Adapter{
私人物品清单;
专用通知StatAdapter(列表数据){
this.listItems=数据;
}
@凌驾
公共通知onCreateViewHolder上的ViewHolder(视图组父级,int-viewType){
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.notice\u list\u card,parent,false);
返回新的NoticeViewHolder(视图);
}
@凌驾
BindViewHolder上的公共无效(NoticeViewHolder,内部位置){
final NoticeItem NoticeItem=listItems.get(位置);
持有人通知(noticeItem);
}
@凌驾
public int getItemCount(){
返回listItems.size();
}
私人通知(列表通知){
列表项目=通知;
}
}
  • 检查片段的父活动。在活动中注册本地广播接收器,然后在片段中注册

  • 如果从firebase广播发送时接收到意图,是否尝试登录onReceive?另外,在onPause中:LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mNoticeBroadcastReceiver);。当活动暂停时,您正在注销广播,您确定在收到数据时未注销广播吗?Yh…我可以登录以查看附加信息,以证明广播正常。对于否决我问题的人,我很高兴知道原因。在适配器中的private void setNotices。添加Log.e(“tag”,“size:+notices.size());粘贴到这里我已经指出,我认为广播工作得很好,只是我似乎无法用SQLite的数据更新UI。
    private class NoticeListAdapter extends RecyclerView.Adapter<NoticeViewHolder>{
    
        private List<NoticeItem> listItems;
    
        private NoticeListAdapter(List<NoticeItem> data) {
            this.listItems = data;
        }
    
    
        @Override
        public NoticeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.notice_lists_card, parent, false);
            return new NoticeViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(NoticeViewHolder holder, int position){
    
            final NoticeItem noticeItem = listItems.get(position);
            holder.bindNotice(noticeItem);
    
        }
    
        @Override
        public int getItemCount() {
            return listItems.size();
        }
    
        private void setNotices(List<NoticeItem> notices){
                listItems = notices;
        }
    }