从广播接收器更新片段中的列表视图

Posted

技术标签:

【中文标题】从广播接收器更新片段中的列表视图【英文标题】:Update a listview in a fragment from a broadcast receiver 【发布时间】:2013-03-03 19:27:44 【问题描述】:

如果文件成功下载,我必须更新片段中的列表视图。因此,在我的下载管理器的 BroadcastReceiver 中,我注册了这个新的广播接收器:

Intent intent = new Intent();
intent.setAction("CONTENTS_NOTIFICATION");
context.sendBroadcast(intent);

在我的 onCreateView 片段中,我添加以下代码以注册接收器:

IntentFilter filter = new IntentFilter("CONTENTS_NOTIFICATION");
getActivity().getApplicationContext().registerReceiver(myReceiver, filter);

然后:

private BroadcastReceiver myReceiver = new BroadcastReceiver() 

        @Override
        public void onReceive(Context context, Intent intent) 

            SQLiteDatabase db = DatabaseManager.getInstance(getActivity()).getWritableDatabase();
              c = SelectedExperience.getSelectedExperiences(db);

              String id_esperienza = "Selected Experience";

              if (c.getCount() != 0) 
                  id_esperienza = c.getString(c.getColumnIndex(SelectedExperience.ID_ESPERIENZA));
              

            populateListview(v, id_esperienza);

        
    ;

最后:

public void onDestroyView() 
      super.onDestroyView();
      getActivity().getApplicationContext().unregisterReceiver(myReceiver);

我必须为两个不同的片段添加两个这样的广播接收器。在第一个上,一切正常。如果在应用程序中用户在片段上,它会更新,而在第二个片段上我收到以下错误:

03-15 07:32:40.474: E/androidRuntime(1692): FATAL EXCEPTION: main
03-15 07:32:40.474: E/AndroidRuntime(1692): java.lang.RuntimeException: Error receiving broadcast Intent  act=CONTENTS_NOTIFICATION flg=0x10  in sample.actionscontentview.fragment.ContentsFragment$1@418e0850
03-15 07:32:40.474: E/AndroidRuntime(1692):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:768)
03-15 07:32:40.474: E/AndroidRuntime(1692):     at android.os.Handler.handleCallback(Handler.java:725)
03-15 07:32:40.474: E/AndroidRuntime(1692):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-15 07:32:40.474: E/AndroidRuntime(1692):     at android.os.Looper.loop(Looper.java:137)
03-15 07:32:40.474: E/AndroidRuntime(1692):     at android.app.ActivityThread.main(ActivityThread.java:5191)
03-15 07:32:40.474: E/AndroidRuntime(1692):     at java.lang.reflect.Method.invokeNative(Native Method)
03-15 07:32:40.474: E/AndroidRuntime(1692):     at java.lang.reflect.Method.invoke(Method.java:511)
03-15 07:32:40.474: E/AndroidRuntime(1692):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
03-15 07:32:40.474: E/AndroidRuntime(1692):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
03-15 07:32:40.474: E/AndroidRuntime(1692):     at dalvik.system.NativeStart.main(Native Method)
03-15 07:32:40.474: E/AndroidRuntime(1692): Caused by: java.lang.NullPointerException
03-15 07:32:40.474: E/AndroidRuntime(1692):     at sample.actionscontentview.fragment.ContentsFragment.populateListview(ContentsFragment.java:194)
03-15 07:32:40.474: E/AndroidRuntime(1692):     at sample.actionscontentview.fragment.ContentsFragment.access$0(ContentsFragment.java:111)
03-15 07:32:40.474: E/AndroidRuntime(1692):     at sample.actionscontentview.fragment.ContentsFragment$1.onReceive(ContentsFragment.java:107)
03-15 07:32:40.474: E/AndroidRuntime(1692):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:758)
03-15 07:32:40.474: E/AndroidRuntime(1692):     ... 9 more

和代码是一样的!我不明白为什么它不起作用。它说 populatelistView 存在问题,但如果不从广播接收器调用,相同的函数在片段内可以正常工作。

我认为这两个片段之间的唯一区别是,更新起作用的是应用程序启动时打开的第一个片段。

【问题讨论】:

什么是行号。 194并发布populateListView的代码 我的错...错误出现在 populatelistView 中,特别是我传递了错误的视图!所以代码工作正常! 【参考方案1】:

尝试使用 GreenRobot 的 EventBus https://github.com/greenrobot/EventBus

成功下载文件后,您可以发布活动

EventBus.getDefault().post(YourData.Downloaded);

您的片段将注册以接收事件,最好在 onStart() 方法中

EventBus.getDefault().register(this);

它会在 onEvent 方法中接收事件:

public void onEvent(Data.State) 

然后您可以轻松更新您的列表视图。您还可以从 onStop() 方法中的接收事件中取消注册。您可以将数据保留在您的应用程序中或存储。这是非常简单且不错的解决方案。希望能帮助到你。您可以为此事件注册任意数量的片段,因此一旦 EventBus 发布事件,为其注册的所有可用片段都将收到此事件。

【讨论】:

【参考方案2】:

我知道这是旧的,但如果你能从你的经验中帮助我,而不是在我的问题上做:

我在这里发布了一个类似的问题:Broadcast receivers and Fragments。您可以寻找我所做的解决方法,尽管我认为应该有更好的方法来做到这一点。

有些人建议所有广播都转到托管片段的 Activity,并通过侦听器告诉片段他们应该根据收到的内容更新视图。这可能是一种更好的方法,但它仍然可能涉及检查片段视图的空指针。

【讨论】:

以上是关于从广播接收器更新片段中的列表视图的主要内容,如果未能解决你的问题,请参考以下文章

如何使用警报管理器将数据从片段传递到广播接收器

Android - 在动态注册的广播接收器上出现“无法传递广播”错误

广播接收器,AIDL和Messenger有什么区别?

从广播接收器android调用活动方法?

清单与活动中的广播接收器注册

广播接收器没有收到额外的