2013-03-15 13 views
10

Bir dosya başarılı bir şekilde karşıdan yüklüyorsa bir parçadaki liste görünümünü güncellemeliyim. Yani benim indirme yöneticisinin BroadcastReceiver içinde ben bu yeni yayın alıcısı kayıt: o zamanBir yayın alıcıdan bir parçadaki liste görünümünü güncelle

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

:

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

Ve alıcıyı kaydetmek için aşağıdaki kodu ekleyin onCreateView benim fragmanında

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

ve sonunda

İki farklı Fragman için bu yayın alıcılarından ikisini eklemeliyim. İlkinde, her şey yolunda.

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 

ve kod aynıdır: uygulamada kullanıcı fragmanı açıksa, ikinci parçanın üzerinde ben bu hataları var iken, günceller! Neden çalışmadığını anlayamıyorum. PopulatelistView ile ilgili bir sorun olduğunu söylüyor ancak aynı fonksiyon, yayın alıcısından çağrılmadığı takdirde fragmanın içinde iyi çalışıyor.

Bu iki parça arasında düşünebildiğim tek fark, uygulamanın başlatıldığı sırada güncelleştirmenin ilk çalıştırıldığı sürümdür.

+1

satır no. 194 ve populateListView için kodu gönder – Atrix1987

+0

Benim kötü ... Hata populatelistView oldu, özellikle yanlış görünümü geçiyordu! Yani kod iyi çalışıyor! – phcaze

cevap

4

GreenRobot tarafından EventBus kullanmayı deneyin https://github.com/greenrobot/EventBus

dosya başarıyla Bir etkinlik

EventBus.getDefault().post(YourData.Downloaded); 
sonrası indirildiğinde Kişisel fragmanı tercihen onStart içinde, olayları almak için kaydedecektir

() metodu

EventBus.getDefault().register(this); 

Ve onEvent yöntemindeki olayları alır:

public void onEvent(Data.State) {} 

ve daha sonra liste listenizi kolayca güncelleyebilirsiniz. Ayrıca, onStop() yöntemindeki olayları almamayı da unuttunuz. Verileri Uygulamanızda saklayabilir veya saklayabilirsiniz. Çok kolay ve güzel bir çözüm. Umarım yardımcı olur. Bu olay için istediğiniz kadar çok bölüm kaydedebilirsiniz, böylece EventBus olayı gönderdikten sonra, bu olay için kayıtlı tüm mevcut parçalar alınacaktır.

0

Bu eski olduğunu biliyorum ama durumda benim konusu lütfen daha sizin deneyimlerinden bana yardımcı olabilir: Burada benzer bir soru gönderdiniz

: Broadcast receivers and Fragments. Yaptığım çözümü bulabilirsin, ancak bunu yapmanın daha iyi bir yolu olmalı diye düşünüyorum.

Bazı yayınların, parçaları barındıran etkinliğe gittiğini ve bir dinleyici aracılığıyla, fragmanları, nelerin alındığına göre görünümü güncelleştirmeleri gerektiğini anlatır. Bu daha iyi bir yaklaşım olabilir, ancak yine de parçacıkların görünümünü kontrol eden boş göstergeleri de içerebilir.

İlgili konular