英文:
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/onDestroyonStart/onStoponResume/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/onDestroyonStart/onStoponResume/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语言的经验与见解,让所有开发者获益!

评论