0

我有一个使用互联网的应用程序。在发送请求之前,我使用代码检查连接:

  protected boolean isNetworkAvailable(Context context) {
    ConnectivityManager cm = 
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean result = false;
    if (null != activeNetwork) {
        result = activeNetwork.isAvailable() 
            && activeNetwork.isConnectedOrConnecting();
    }
    return result;
}

它运行良好,但在极少数情况下,日志告诉我应用程序无法执行请求,因为 isNetworkAvailable 返回 false。在用户向我保证 wifi 已打开并且他能够发送和接收电子邮件之前,一切都很好。那么你有什么想法为什么会出现这种情况?

4

1 回答 1

0

我遇到了类似的问题,如果我打开了飞行模式,没有手机/wifi并且我运行我的应用程序,它将尝试不向我显示网络连接警报,而是尝试登录然后触发我的服务器不是的警报可达。

这是原始代码:

    private void CheckNetworkState(Context context)
        {
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            boolean error = true;
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

            if(activeNetwork != null)
                if(activeNetwork.isConnected()&&activeNetwork.isAvailable())
                    error = false;

            if(error)
                ShowFatalAlert(context,"Internet Connection","This application requires an active internet connection to work!");

            new CheckLogin().execute();
        }

    private void ShowFatalAlert(Context context, String title, String msg){
        AlertDialog.Builder alert = new AlertDialog.Builder(context);
        final AlertDialog ad = alert.create();
        alert.setTitle(title);
        alert.setMessage(msg);

        alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                MainActivity.this.moveTaskToBack(true);
                //android.os.Process.killProcess(android.os.Process.myPid());
            }
        });

        alert.show();
        if(ad.isShowing())
            ad.dismiss();
    }

    @Override
    public void onRestart(){
        super.onRestart();
        if(user.get(1)== "")
            CheckNetworkState(this);
    }

我遇到的问题是 checklogin 是一个异步任务,并且没有等待我的 ShowFatalAlert 函数完成。解决方案就像在 else 语句中移动异步执行一样简单:

        if(error)
            ShowFatalAlert(context,"Internet Connection","This application requires an active internet connection to work!");
        else            
            new CheckLogin().execute();

不确定这对您的代码有多适用,也许您发布了调用 isNetworkAvailable 的代码?因为我不认为你对这个函数有问题,而是你如何处理它的返回。

于 2014-01-19T04:55:44.213 回答