应用程序在进入onPause时崩溃



单击toggle button时,我有两个broadcastReceiversonResume注册。在onPause中,我注销了它们,但当我按下主页按钮时,应用程序崩溃,logcat会生成以下错误。

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:  
com.example.wifi_socket_01.wifi_socket_01$1@43033000
11-08 17:18:00.025: E/AndroidRuntime(5541): Caused by:  
java.lang.IllegalArgumentException: Receiver not registered: com.
example.wifi_socket_01.wifi_socket_01$1@43033000
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)

onResume()您只注册了一个接收器。但是mWiFiReceiver是从另一个接收器注册的。当onPause执行时,它将自然注销mNetworkReceiver。但是注销接收器(mWiFiReceiver);会给您错误,因为它没有在那里注册。

You are attempting to unregister the receiver which is not registered 所示

在您的onResume()中,只有一个接收器正在注册,但在onPause()中,有两个接收器正在注销。尝试注销not-registered接收器(wifi接收器)导致引发异常。

或者您可以在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
           }
           ....

你将能够捕捉到意想不到的问题。

相关内容

  • 没有找到相关文章

最新更新