检查Android应用中的互联网连接

时间:2016-01-24 20:13:58

标签: java android http

我试图从Android应用中检查 INTERNET 连接,但只是继续遇到问题。

我没有找到测试可用网络连接的代码 - 我已经开始工作 - 这是为了测试我是否可以访问互联网网站。

(我很感激,如果我在一个提供登录屏幕而不是所请求网站的系统后面,我可能无法获得我想要的确切结果,但我会在稍后处理)

感谢以下问题,我认为我已经取得了一些进展,但是当我运行该应用时,它会崩溃(下面的错误信息)。

我到目前为止的代码如下(我必须承认我发现try / catch的东西有点令人费解和乏味: - /)

static public boolean isInternetReachable() {
    int statusCode = -1;
    try{
        URL url = new URL("http://www.google.com/humans.txt");
        HttpURLConnection http = (HttpURLConnection) url.openConnection();
        statusCode = http.getResponseCode();
        http.disconnect();
    } catch (MalformedURLException ex) {
        return false;
    } catch (IOException ex) {
        return false;
    }
    if (statusCode == HttpURLConnection.HTTP_OK) {
        return true;
    }
    else
    {
        //connection is not OK
        return false;
    }
}

我确信有更简洁的方法可以做到这一点,所以欢迎任何一般性建议。

我在应用崩溃时遇到的错误是:

01-24 19:53:14.767 10617-10617/com.nooriginalthought.bluebadgeparking E/AndroidRuntime:
     FATAL EXCEPTION: main
     Process: com.nooriginalthought.bluebadgeparking, PID: 10617
     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nooriginalthought.bluebadgeparking/com.nooriginalthought.bluebadgeparking.PreLoadChecks}: android.os.NetworkOnMainThreadException
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2411)
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
         at android.app.ActivityThread.access$800(ActivityThread.java:144)
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
         at android.os.Handler.dispatchMessage(Handler.java:102)
         at android.os.Looper.loop(Looper.java:155)
         at android.app.ActivityThread.main(ActivityThread.java:5696)
         at java.lang.reflect.Method.invoke(Native Method)
         at java.lang.reflect.Method.invoke(Method.java:372)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
     Caused by: android.os.NetworkOnMainThreadException
         at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1155)
         at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
         at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
         at java.net.InetAddress.getAllByName(InetAddress.java:215)
         at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
         at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:236)
         at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
         at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
         at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
         at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
         at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
         at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:491)
         at com.nooriginalthought.bluebadgeparking.PreLoadChecks.isInternetReachable(PreLoadChecks.java:41)
         at com.nooriginalthought.bluebadgeparking.PreLoadChecks.onCreate(PreLoadChecks.java:70)
         at android.app.Activity.performCreate(Activity.java:5958)
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474) 
         at android.app.ActivityThread.access$800(ActivityThread.java:144) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:155) 
         at android.app.ActivityThread.main(ActivityThread.java:5696) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at java.lang.reflect.Method.invoke(Method.java:372) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823) 

1 个答案:

答案 0 :(得分:1)

正如大卫在评论中提到的那样,你应该只为谷歌提供异常名称,并试着自己扭转局面。

通过查看他所指的StackOverflow answer,您需要在主线程之外进行所有网络通信。最常用的方法是创建AsyncTask。

在您的情况下,它会显示(您可以创建一个新的 InternetTask.java 或只是将其附加到您当前的 MainActivity.java ),例如:

class InternetTask extends AsyncTask<Void, Void, Boolean>{
    private MainActivity activity;

    InternetTask(MainActivity activity){
        this.activity = activity;
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        int statusCode = -1;
        try{
            URL url = new URL("http://www.google.com/humans.txt");
            HttpURLConnection http = (HttpURLConnection) url.openConnection();
            statusCode = http.getResponseCode();
            http.disconnect();
        } catch (MalformedURLException ex) {
            return false;
        } catch (IOException ex) {
            return false;
        }
        if (statusCode == HttpURLConnection.HTTP_OK) {
            return true;
        }
        else
        {
            //connection is not OK
            return false;
        }
    }

    @Override
    protected void onPostExecute(Boolean aBoolean) {
        super.onPostExecute(aBoolean);
        activity.receiveMagic(aBoolean);
    }
}

然后,您只需在活动中添加一个新的公共方法,即可在 MainActivity 中接收布尔值。

public void receiveMagic(Boolean isGood){
    if (isGood){
        Toast.makeText(MainActivity.this, "It is good", Toast.LENGTH_SHORT).show();
    }else {
        Toast.makeText(MainActivity.this, "It is not connected", Toast.LENGTH_SHORT).show();
    }
}

您需要使用活动调用新的 AsyncTask

new InternetTask(this).execute();

请务必同时为您的清单添加互联网权限。