phc*_*aze 10 android listview fragment broadcastreceiver
如果文件成功下载,我必须更新片段中的列表视图.所以在我的下载管理器的BroadcastReceiver中,我注册了这个新的广播接收器:
Intent intent = new Intent();
intent.setAction("CONTENTS_NOTIFICATION");
context.sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
在onCreateView的片段中,我添加以下代码以注册接收器:
IntentFilter filter = new IntentFilter("CONTENTS_NOTIFICATION");
getActivity().getApplicationContext().registerReceiver(myReceiver, filter);
Run Code Online (Sandbox Code Playgroud)
然后:
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);
}
};
Run Code Online (Sandbox Code Playgroud)
最后:
public void onDestroyView() {
super.onDestroyView();
getActivity().getApplicationContext().unregisterReceiver(myReceiver);
}
Run Code Online (Sandbox Code Playgroud)
我必须为两个不同的片段添加两个这样的广播接收器.在第一个,一切正常.如果在应用程序中用户在片段上,它会更新,而在第二个片段上我得到了这些错误:
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
Run Code Online (Sandbox Code Playgroud)
和代码是一样的!我不明白为什么它不起作用.它说populatelistView存在问题,但如果没有从广播接收器调用,则相同的功能在片段内工作正常.
我可以在这两个片段之间思考的唯一区别是更新工作的那个是在启动应用程序时打开的第一个片段.
尝试使用 GreenRobot 的 EventBus https://github.com/greenrobot/EventBus
当您的文件成功下载后,您发布一个事件
EventBus.getDefault().post(YourData.Downloaded);
Run Code Online (Sandbox Code Playgroud)
您的片段将注册接收事件,最好在 onStart() 方法中
EventBus.getDefault().register(this);
Run Code Online (Sandbox Code Playgroud)
它将在 onEvent 方法中接收事件:
public void onEvent(Data.State) {}
Run Code Online (Sandbox Code Playgroud)
然后您可以轻松更新您的列表视图。您还可以在 onStop() 方法中取消注册接收事件。您可以将数据保存在您的应用程序中或存储。这是非常简单和不错的解决方案。希望能帮助到你。您可以为此事件注册任意数量的片段,因此一旦 EventBus 发布事件,为其注册的所有可用片段都将接收此事件。
| 归档时间: |
|
| 查看次数: |
6454 次 |
| 最近记录: |