没有网络连接警告对话框。NetworkCallback已经取消注册错误。

huangapple 未分类评论44阅读模式
英文:

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(&quot;Oops!... No Internet Connection&quot;)
                            .setMessage(&quot;Check your WIFI or your Mobile Data&quot;)
                            .setPositiveButton(&quot;OK&quot;, 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.

&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_WIFI_STATE&quot; /&gt;

答案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
}

huangapple
  • 本文由 发表于 2020年4月7日 04:12:46
  • 转载请务必保留本文链接:https://java.coder-hub.com/61068183.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定