英文:
No internet Connection Alert Dialog box. NetworkCallback was already unregistered error
问题
我正试图在我的应用程序上创建一个无网络连接警告对话框,它能够工作,但之后应用程序崩溃。
java.lang.IllegalArgumentException: NetworkCallback was already unregistered
public class MainActivity extends AppCompatActivity {
private ConnectivityManager mCManager;
private ConnectivityManager.NetworkCallback mCallback;
private AlertDialog mDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest request = new NetworkRequest.Builder().build();
mCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onLost(Network network) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this, R.style.Theme_AppCompat_Dialog_Alert)
.setTitle("Oops!... No Internet Connection")
.setMessage("Check your WIFI or your Mobile Data")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finishAndRemoveTask();
}
});
mDialog = builder.show();
}
@Override
public void onAvailable(Network network) {
if (mDialog != null) {
mDialog.dismiss();
}
}
};
mCManager.registerNetworkCallback(request, mCallback);
}
@Override
public void onStop() {
mCManager.unregisterNetworkCallback(mCallback);
super.onStop();
}
}
我在应用程序清单中声明了如下内容:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
英文:
I am trying to create a no internet connection alert dialog box on my app, it works but app crashes afterwards.
> java.lang.IllegalArgumentException: NetworkCallback was already unregistered
public class MainActivity extends AppCompatActivity {
private ConnectivityManager mCManager;
private ConnectivityManager.NetworkCallback mCallback;
private AlertDialog mDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest request = new NetworkRequest.Builder().build();
mCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onLost(Network network) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this, R.style.Theme_AppCompat_Dialog_Alert)
.setTitle("Oops!... No Internet Connection")
.setMessage("Check your WIFI or your Mobile Data")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finishAndRemoveTask();
}
});
mDialog = builder.show();
}
@Override
public void onAvailable(Network network) {
if (mDialog != null) {
mDialog.dismiss();
}
}
};
mCManager.registerNetworkCallback(request, mCallback);
}
@Override
public void onStop() {
mCManager.unregisterNetworkCallback(mCallback);
super.onStop();
}
}
I declared this in my application manifest as shown below.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
答案1
得分: 0
你的问题在于你在 onCreate
中添加了它,但在 onStop
中却移除了。添加/移除监听器应当在相匹配的方法中完成:
onCreate
/onDestroy
onStart
/onStop
onResume
/onPause
因为你只想在用户打开应用程序时显示,所以你可能希望在 onStart
中注册,在 onStop
中取消注册。只需确保在 onStart
中检查是否需要最初显示它。
英文:
Your problem is that you're adding it in onCreate
, but removing it in onStop
. Adding/removing listeners should be done in the matching methods:
onCreate
/onDestroy
onStart
/onStop
onResume
/onPause
Since you only want to show when the user has the app open, you probably want to register in onStart
and unregister in onStop
. Just make sure to check if you want to display it initially in onStart
as well.
答案2
得分: -1
只需添加一个try catch,如下所示,以忽略异常:
try {
mCManager.unregisterNetworkCallback(mCallback);
} catch(Exception e) {
// 忽略
}
英文:
Just add a try catch like thisto ignore the exception:
try {
mCManager.unregisterNetworkCallback(mCallback);
} catch(Exception e) {
// ignore
}
专注分享java语言的经验与见解,让所有开发者获益!
评论