2015-04-17 42 views
0

我收到此錯誤:「錯誤接收廣播意圖」在片段

04-17 09:35:10.227: E/AndroidRuntime(9377): java.lang.RuntimeException: Error receiving broadcast Intent { act=com.aldakur.instalacionesdep.services.action.FIN flg=0x10 } in com.a[email protected]42721b68 
04-17 09:35:10.227: E/AndroidRuntime(9377):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:776) 
04-17 09:35:10.227: E/AndroidRuntime(9377):  at android.os.Handler.handleCallback(Handler.java:733) 
04-17 09:35:10.227: E/AndroidRuntime(9377):  at android.os.Handler.dispatchMessage(Handler.java:95) 
04-17 09:35:10.227: E/AndroidRuntime(9377):  at android.os.Looper.loop(Looper.java:136) 
04-17 09:35:10.227: E/AndroidRuntime(9377):  at android.app.ActivityThread.main(ActivityThread.java:5146) 
04-17 09:35:10.227: E/AndroidRuntime(9377):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-17 09:35:10.227: E/AndroidRuntime(9377):  at java.lang.reflect.Method.invoke(Method.java:515) 
04-17 09:35:10.227: E/AndroidRuntime(9377):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) 
04-17 09:35:10.227: E/AndroidRuntime(9377):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 
04-17 09:35:10.227: E/AndroidRuntime(9377):  at dalvik.system.NativeStart.main(Native Method) 
04-17 09:35:10.227: E/AndroidRuntime(9377): Caused by: java.lang.NullPointerException 
04-17 09:35:10.227: E/AndroidRuntime(9377):  at com.aldakur.instalacionesdep.info.RssAvisosFragment$ProgressReceiver.onReceive(RssAvisosFragment.java:123) 
04-17 09:35:10.227: E/AndroidRuntime(9377):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:766) 

這是我的代碼片段。

onCreateView方法:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    View view = inflater.inflate(R.layout.rss_avisos, container, false); 

    ListView lv = (ListView)view.findViewById(R.id.rss_avisos_lv); 
    lv.setOnItemClickListener(this); 

    if(isMyServiceRunning()){ 

     pDialog3 = new ProgressDialog(getActivity()); 
     pDialog3.setMessage("3.Cargando Noticias..."); 
     pDialog3.setCancelable(false); 
     pDialog3.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     pDialog3.show(); 


     } 

     IntentFilter filter = new IntentFilter(); 
     filter.addAction(CheckNuevosAvisosIntentService.ACTION_PROGRESO); 
     filter.addAction(CheckNuevosAvisosIntentService.ACTION_FIN); 
     getActivity().registerReceiver(rcv, filter); 
     AvisosEnListaAdapter adapter = new AvisosEnListaAdapter(getActivity(), avisosList); 
     lv.setAdapter(adapter); 
    return view; 
} 

而且我BroadCastReceiver

public class ProgressReceiver extends BroadcastReceiver { 

    //ProgressDialog pDialog2 = new ProgressDialog(RssAvisosActivity.this); 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if(intent.getAction().equals(CheckNuevosAvisosIntentService.ACTION_PROGRESO)) { 
      int prog = intent.getIntExtra("progreso", 0); 

      if(!pDialog3.isShowing()){ 
      pDialog3.setMessage("2.Cargando Noticias..."); 
      pDialog3.setCancelable(false);//erabiltzaileak atzera botoia sakatuz ez kantzelatzeko 
      pDialog3.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
      pDialog3.show(); 

      } 

     } 
     else if(intent.getAction().equals(CheckNuevosAvisosIntentService.ACTION_FIN)) { 

      //Select 
      DataBaseHelper myDB = new DataBaseHelper(getActivity().getBaseContext()); 
      myDB.openDataBase(); 
      avisosList = myDB.getAllAvisos("eu"); 
      AvisosEnListaAdapter adapter = new AvisosEnListaAdapter(getActivity(), avisosList); 
      lv.setAdapter(adapter); 

      if(pDialog3.isShowing()){ 
       pDialog3.dismiss(); 
     } 
     } 
    } 

} 

我覺得getActivity.unregisterReceiver(RCV)可能是解決 但不知道在哪裏寫。 在活動中,此代碼被寫入。

在哪裏可以寫Fragment的代碼?

謝謝。在onReceive()

回答

2

我認爲你有一個NullPointerException嘗試在你試圖getActivity()的行。所以我認爲你是以錯誤的方式註冊/註銷接收者。你應該在onResume進行註冊和註銷的,像這樣:

@Override 
public void onResume() { 
    super.onResume(); 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction(CheckNuevosAvisosIntentService.ACTION_PROGRESO); 
    filter.addAction(CheckNuevosAvisosIntentService.ACTION_FIN); 
    getActivity().registerReceiver(rcv, filter); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    getActivity().unregisterReceiver(rcv); 
} 

另外,不要忘記從onCreateView()方法刪除此行getActivity().registerReceiver(rcv, filter);。而根據logcat的異常,當您收到ACTION_FIN動作的出現,讓我強烈建議你isAdded()條件添加到您的if條款,以確保片段連接到活動:

else if(intent.getAction().equals(CheckNuevosAvisosIntentService.ACTION_FIN) 
     && isAdded()) { 
     // your code here 
    } 
+0

但在片段有沒有方法的onPause ()和onResume()。 – aldakur

+0

你確定嗎?檢查片段生命週期在這裏http://developer.android.com/guide/components/fragments.html#Creating。 – rom4ek

+0

你是對的。但尚未解決。 – aldakur

0

添加行之前,你顯示對話框:

@Override 
     public void onReceive(Context context, Intent intent) {    
     if(intent.getAction().equals(CheckNuevosAvisosIntentService.ACTION_PROGRESO)) { 
       int prog = intent.getIntExtra("progreso", 0); 
       pDialog3 = new ProgressDialog(getActivity()); // this line will prevent NPE 
       if(!pDialog3.isShowing()){ 
        pDialog3.setMessage("2.Cargando Noticias..."); 
        pDialog3.setCancelable(false);//erabiltzaileak atzera botoia sakatuz ez kantzelatzeko 
        pDialog3.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
        pDialog3.show(); 
       } 
      } 

這是越來越pDialog3爲NULL,並在Fragment拋出空指針異常

0

在大多數情況下使用BroadcastReceiver的,BroadcastReceiveronStart註冊並在onStop未註冊。如果註冊和取消註冊BroadcastReceiver推薦onStartonStop。因爲在Activity的使用壽命中,onStartonDestroy之前的onCreateonStop之後被調用,而通常在onCreate中初始化小部件,但onDestroy不能始終及時執行。 Fragment的壽命依賴於Activity的壽命。