【问题标题】:On first click gave me a wrong output第一次点击给了我一个错误的输出
【发布时间】:2016-11-05 14:36:18
【问题描述】:

我已经修改了我之前的代码——这段代码运行正常。唯一的问题是,启动它后,第一次点击它总是显示输出为:

“互联网不可用”

但在第二次单击时,它会显示正确的输出。

public class MainActivity extends Activity {  

    boolean pingCheck;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button b1=(Button)findViewById(R.id.button1);

        b1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {                   
                Thread t = new Thread(new Runnable() {
                    public void run() {
                        pingCheck = isURLReachable(getApplicationContext());
                    }
                });

                t.start();

                if(pingCheck)
                {
                    Toast.makeText(MainActivity.this,"Network is available",Toast.LENGTH_LONG).show();
                }
                else
                {
                    Toast.makeText(MainActivity.this,"Network not available",Toast.LENGTH_LONG).show();
                }                   
            }
        });
    }


    static public boolean isURLReachable(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();

        if (netInfo != null && netInfo.isConnected()) {
            try {
                URL url = new URL("http://google.com");   // Change to "http://google.com" for www  test.
                HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                urlc.setConnectTimeout( 1000);          // 10 s.
                urlc.connect();

                if (urlc.getResponseCode() == 200) {        // 200 = "OK" code (http connection is fine).
                    Log.wtf("Connection", "Success !");
                    return true;
                } else {
                    return false;
                }
            } catch (MalformedURLException e1) {
                return false;
            } catch (IOException e) {
                return false;
            }
        }

        return false;
    }
}

【问题讨论】:

    标签: java android


    【解决方案1】:

    您不能在线程中运行异步任务并在此之后立即检查结果。您需要等待任务完成。我建议您将回调传递给您的 ping 检查,一旦回调返回,请按照 if(pingCheck) 运行您的代码。

    这应该可以完成工作:

    public static interface OnInternetCheckCallback {
        void onInternetCheckResult(boolean available);
    }
    
    public static void hasInternetAccess(OnInternetCheckCallback callback) {
        new AsyncTask<OnInternetCheckCallback, Void, Boolean>() {
            private OnInternetCheckCallback mCallback;
    
            @Override
            protected Boolean doInBackground(OnInternetCheckCallback... params) {
                mCallback = params[0];
                try {
                    URL checkUrl = new URL(HEALTHCHECK_URL);
                    HttpURLConnection connection = (HttpURLConnection) checkUrl.openConnection();
                    connection.setRequestProperty("User-Agent", "Android");
                    connection.setRequestProperty("Connection", "close");
                    connection.setConnectTimeout(1500);
                    connection.connect();
                    return (connection.getResponseCode() == 200 && connection.getContentLength() <= 0);
                } catch (IOException e) {
                    Log.e(TAG, ".doInBackground() - Error checking internet connection", e);
                }
                return false;
            }
    
            @Override
            protected void onPostExecute(Boolean result) {
                mCallback.onInternetCheckResult(result);
            }
        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, callback);
    }
    

    另外,可能更好的办法是检查您自己的服务器而不是 google.com,因为 Google 服务器在某些国家/地区被阻止。

    【讨论】:

    • 有什么具体的你没有得到吗?现在问题解决了吗?
    • @RahulGupta 也许如果您只是使用我建议的解决方案,您不会遇到新问题?另外,不要检查谷歌,也不要使用超过 1500-2000 毫秒的超时时间。添加属性 - 它们可能会有所帮助。如果您的呼叫在您的超时为 1500 毫秒时需要一分钟,那么您的任务可能不会立即执行?也许另一个AsyncTask 正在用完线程?
    • ,谢谢,我只是将谷歌的 url 更改为其他服务器,现在所有正确的响应都在 2s 内,也保持超时到 1500
    • @RahulGupta 如果您觉得我的回答有帮助,请勾选上面的方框,将其选为正确答案。谢谢
    • 实际上我使用了我发送给您链接的代码,因为您告诉我应该减少超时和我们正在 ping 的 URL,所以我只这样做了。我放了我自己网站的 url 并将超时时间减少到 1500 。再次感谢你帮了我很多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2021-09-09
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多