android – 从广播接收器更新片段中的列表

如果文件成功下载,我必须更新片段中的列表视图.所以在我的下载管理器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有一个问题,但是如果没有从广播接收器中调用,则该片段中相同的功能工作正常.

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

解决方法

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

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

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

您的片段将注册接收事件,最好使用onStart()方法

EventBus.getDefault().register(this);

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

public void onEvent(Data.State) {}

然后您可以轻松更新列表视图.您也可以通过onStop()方法取消注册接收事件.您可以将数据保存在应用程序中或存储.这是非常容易和一个很好的解决方案.希望它有帮助.您可以为此事件注册多少个片段,因此一旦EventBus发布事件,所有可用的片段都将被注册,将会收到此事件.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...