10

ファイルが正常にダウンロードされた場合、フラグメント内のリストビューを更新する必要があります。したがって、ダウンロード マネージャーの 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);
}

2 つの異なるフラグメントに対して、これらのブロードキャスト レシーバーを 2 つ追加する必要があります。最初のものでは、すべて正常に動作します。アプリケーションでユーザーがフラグメントを使用している場合は更新されますが、2 番目のフラグメントでは次のエラーが発生しました。

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 に問題があると書かれていますが、ブロードキャスト レシーバーから呼び出されない場合、フラグメント内で同じ関数が正常に動作します。

この 2 つのフラグメントで考えられる唯一の違いは、更新が機能するのは、アプリケーションの起動時に最初に開かれるフラグメントであるということです。

4

2 に答える 2

5

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 がイベントを送信すると、登録されている使用可能なすべてのフラグメントがこのイベントを受け取ります。

于 2014-07-08T20:00:12.700 に答える