2013-03-15 2 views
10

파일이 성공적으로 다운로드되면 조각에서 목록보기를 업데이트해야합니다. 그래서 내 다운로드 관리자의 브로드 캐스트 리시버에 나는이 새로운 방송 수신기를 등록 : 다음브로드 캐스트 수신기의 조각에서 목록보기 업데이트

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

:

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

내가 수신기를 등록하기 위해 다음 코드를 추가 onCreateView 내 조각에서

public void onDestroyView() { 
     super.onDestroyView(); 
     getActivity().getApplicationContext().unregisterReceiver(myReceiver); 
} 
,536,913,632 :

과 끝에

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); 

     } 
    }; 
10

두 개의 서로 다른 Fragment에 대해 두 개의 브로드 캐스트 리시버를 추가해야합니다. 첫 번째 문제는 모두 정상적으로 작동합니다. 응용 프로그램에서 사용자가 조각에 있다면, 업데이트, 두 번째 조각에 나는 이러한 오류가있어 :

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 [email protected] 
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에 문제가 있지만 방송 수신기에서 호출하지 않으면 동일한 기능이 조각 내에서 잘 작동한다고 말합니다.

이 두 조각 사이에서 생각할 수있는 유일한 차이점은 응용 프로그램을 시작할 때 열린 첫 번째 업데이트가 있다는 것입니다.

+1

줄 번호는 무엇입니까? 194 및 populateListView에 대한 코드를 게시 – Atrix1987

+0

내 나쁜 ... 오류 populatelistView에, 특히 내가 잘못된보기를 통과했다! 그래서 코드는 잘 작동합니다! – phcaze

답변

4

것은 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에서 이벤트를 게시하면 등록 된 사용 가능한 모든 조각에이 이벤트가 수신됩니다.

0

나는이 오래 알고 있지만 경우에 당신은 내 문제에서 해 주시기 바랍니다보다 경험에서 나를 도울 수 있습니다 : 여기 비슷한 질문을 게시 한

: Broadcast receivers and Fragments. 내가 한 해결 방법을 찾을 수는 있지만 더 나은 방법이 있어야한다고 생각합니다.

어떤 사람들은 모든 브로드 캐스트가 프래그먼트를 호스팅하는 활동으로 이동하고 수신자를 통해 프래그먼트에 수신 된 내용을 기반으로보기를 업데이트해야한다고 제안하는 사람들이 있습니다. 이는 더 나은 접근 방법이 될 수 있지만 여전히 조각의 뷰를 확인하는 null 포인터를 포함 할 수 있습니다.

관련 문제