2014-11-08 52 views
0

我有2 broadcastReceivers當點擊toggle button時從onResume註冊。並在我註銷它們,但當我按主頁按鈕應用程序崩潰logcat生成以下錯誤。應用程序在onPause時崩潰了嗎?

Code_Updated_2

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    SetUpAllViews(R.layout.activity_main); 

} 

private void setViewState(int view, boolean state) { 
    // TODO Auto-generated method stub 
    switch(view) { 
    case R.id.togbtn_connect: tog_connect.setEnabled(state); 
    case R.id.et_ip: et_ip.setEnabled(state); 
    case R.id.btn_send: btn_send.setEnabled(state); 
    case R.id.et_msg: et_msg.setEnabled(state); 
    } 
} 

private BroadcastReceiver mNetworkReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 

     mConnMgr = (ConnectivityManager)getSystemService(network_service); 
     networkInfo = mConnMgr.getActiveNetworkInfo(); 
     if (networkInfo != null) { 
      if (networkInfo.isConnected()) { 
       setText(R.id.tv_conn_status, ""+networkInfo); 
       registerReceiver(mWiFiReceiver, 
         new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION)); 

       setViewState(R.id.et_ip, true); 
       setViewState(R.id.btn_send, false); 
       setViewState(R.id.et_msg, false); 

      }else if (networkInfo.isConnectedOrConnecting()) { 
       setText(R.id.tv_conn_status, "Status: CONNECTED Or CONNECTING"); 
      }else if (networkInfo.isFailover()){ 
       setText(R.id.tv_conn_status, "Status: FailOver"); 
      }else if (networkInfo.isRoaming()) { 
       setText(R.id.tv_conn_status, "Status: Roaming"); 
      }else if (networkInfo.isAvailable()) { 
       setText(R.id.tv_conn_status, "Status: Available"); 
      } 
     }else { 
      setText(R.id.tv_conn_status, "Status: No Default NetWork Connected"); 
     } 
    } 
}; 

private BroadcastReceiver mWiFiReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 

     mWiFi_Mgr = (WifiManager) getSystemService(wifi_service); 
     if (mWiFi_Mgr != null) 
      mWiFi_Info = mWiFi_Mgr.getConnectionInfo(); 

     int wifiExtras = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN); 

     switch(wifiExtras) { 
     case WifiManager.WIFI_STATE_ENABLING: setText(R.id.tv_wifi_state, "Enabling..."); break; 
     case WifiManager.WIFI_STATE_ENABLED: 
      setText(R.id.tv_wifi_state, "Enabled"); 
      if (mWiFi_Info != null) { 
       if (mWiFi_Info.getBSSID() != null) { 
        setText(R.id.tv_conn_bssid, "BSSID: "+mWiFi_Info.getBSSID()); 
        }else { 
         setText(R.id.tv_conn_bssid, "BSSID: "+mWiFi_Info.getBSSID()); 
         } 
       setText(R.id.tv_conn_speed, "Speed: "+mWiFi_Info.getLinkSpeed()+WifiInfo.LINK_SPEED_UNITS); 
       setText(R.id.tv_conn_strength, "RSSI: "+WifiManager.calculateSignalLevel(mWiFi_Info.getRssi(), 5)); 
       setText(R.id.tv_conn_ip, getIPv4(mWiFi_Info.getIpAddress())); 
      } 
      break; 
     case WifiManager.WIFI_STATE_DISABLING: setText(R.id.tv_wifi_state, "Disabling..."); break; 
     case WifiManager.WIFI_STATE_DISABLED: setText(R.id.tv_wifi_state, "Disabled"); break; 
     case WifiManager.WIFI_STATE_UNKNOWN: setText(R.id.tv_wifi_state, "Unkown_WiFi_State"); break; 
     } 
    } 
}; 

private void SetUpAllViews(int layout) { 
    // TODO Auto-generated method stub 
    setContentView(layout); 

    tv_conn_status = (TextView) findViewById(R.id.tv_conn_status); 
    tv_wifi_state = (TextView) findViewById(R.id.tv_wifi_state); 
    tv_conn_bssid = (TextView) findViewById(R.id.tv_conn_bssid); 
    tv_conn_speed = (TextView) findViewById(R.id.tv_conn_speed); 
    tv_conn_strengt = (TextView) findViewById(R.id.tv_conn_strength); 
    tv_conn_ip = (TextView) findViewById(R.id.tv_conn_ip); 
    et_ip = (EditText) findViewById(R.id.et_ip); 
    tog_connect = (ToggleButton) findViewById(R.id.togbtn_connect); 
    et_msg = (EditText) findViewById(R.id.et_msg); 
    btn_send = (Button) findViewById(R.id.btn_send); 
} 

private void setText(int view, String text) { 
    // TODO Auto-generated method stub 
    switch(view) { 
    case R.id.tv_conn_status: tv_conn_status.setText(text); break; 
    case R.id.tv_wifi_state: tv_wifi_state.setText(text); break; 
    case R.id.tv_conn_bssid: tv_conn_bssid.setText(text); break; 
    case R.id.tv_conn_speed: tv_conn_speed.setText(text); break; 
    case R.id.tv_conn_strength: tv_conn_strengt.setText(text); break; 
    case R.id.tv_conn_ip: tv_conn_ip.setText(text); break; 
    } 
} 

private String getIPv4(int ip) { 
    // TODO Auto-generated method stub 
    String result = String.format("%d.%d.%d.%d", (ip & 0xff), (ip >> 8 & 0xff), (ip >> 16 & 0xff), 
      (ip >> 24 & 0xff)); 

    return result; 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    tog_connect.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      // TODO Auto-generated method stub 
      if (isChecked) { 
       registerReceiver(mNetworkReceiver, 
        new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 
      }else { 
       if (mWiFi_Mgr.getWifiState() == WifiManager.WIFI_STATE_ENABLED) 
        mWiFi_Mgr.setWifiEnabled(false); 
       if (mWiFiReceiver != null) 
        unregisterReceiver(mWiFiReceiver); 
       if (mNetworkReceiver != null) 
        unregisterReceiver(mNetworkReceiver); 
      } 
     } 
    }); 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    //if (mWiFiReceiver != null) 
     //unregisterReceiver(mWiFiReceiver); 
    if (mNetworkReceiver != null) 
     unregisterReceiver(mNetworkReceiver); 
} 

}

logcat的

11-08 17:18:00.025: E/AndroidRuntime(5541): FATAL EXCEPTION: main 
11-08 17:18:00.025: E/AndroidRuntime(5541): Process: com.example.wifi_socket_01, PID: 
5541 
11-08 17:18:00.025: E/AndroidRuntime(5541): java.lang.RuntimeException: Unable to pause 
activity {com.example.wifi_socket_01/com.example.wifi_socket_01.wifi_socket_01}: 
java.lang.IllegalArgumentException: Receiver not registered: 
[email protected] 
11-08 17:18:00.025: E/AndroidRuntime(5541): Caused by: 
java.lang.IllegalArgumentException: Receiver not registered: com. 
[email protected] 
11-08 17:18:00.025: E/AndroidRuntime(5541):  at 
android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:671) 
11-08 17:18:00.025: E/AndroidRuntime(5541):  at 
android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1785) 
11-08 17:18:00.025: E/AndroidRuntime(5541):  at 
com.example.wifi_socket_01.wifi_socket_01.onPause(wifi_socket_01.java:184) 
+0

請同時發佈'onPause'代碼。 – petey 2014-11-08 16:51:29

+0

@petey請參閱更新的代碼,在onPause也有 – user2121 2014-11-08 20:30:26

+0

@petey請參閱更新的代碼的第二次 – user2121 2014-11-08 20:56:59

回答

1

的onResume()要註冊僅一個接收器。但mWiFiReceiver從另一個接收器註冊。 當onPause執行時,它自然會未註冊mNetworkReceiver。但unregisterReceiver(mWiFiReceiver);給你錯誤,因爲它沒有在那裏註冊。

+0

好心請參閱更新的代碼 – user2121 2014-11-08 20:25:51

+0

現在,我想只從在onPause註銷mNetWorkReceiver,並刪除的代碼從onPause註銷mWiFiReceiver,當我運行它的應用程序時,它也crashsed – user2121 2014-11-08 20:29:30

+0

請第二次看到更新代碼 – user2121 2014-11-08 21:01:22

1

或者您可以在您的onPause()方法中包含一個try {...} catch(IllegalArgumentException e){...}結構。

會是這樣的:

if (mWiFi_Mgr.getWifiState() == WifiManager.WIFI_STATE_ENABLED) 
     mWiFi_Mgr.setWifiEnabled(false); 
     if (mWiFiReceiver != null) 
      try { 
       unregisterReceiver(mWiFiReceiver); 
      } catch(IllegalArgumentException e) { 
       //your catching code. 
      } catch (Exception e) { 
       //just in case other exception appears 
      } 
      .... 

您將能夠捕捉到unexpectect問題。

+0

請看最新的代碼 – user2121 2014-11-08 20:30:49

+0

請看第二次更新的代碼 – user2121 2014-11-08 21:08:16

+0

完成後,我編輯了帶您的代碼示例的答案。 – 2014-11-09 21:31:12

1

作爲例外說You are attempting to unregister the receiver which is not registered

在你onResume()只有一個接收器被註冊,但在onPause()兩個接收器正在被註銷。試圖註銷not-registered接收器(無線接收器)會引發異常。

+0

請第二次查看更新的代碼 – user2121 2014-11-08 21:08:39