Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android应用程序中检查互联网连接_Java_Android_Http - Fatal编程技术网

Java 在Android应用程序中检查互联网连接

Java 在Android应用程序中检查互联网连接,java,android,http,Java,Android,Http,我正在尝试从Android应用程序检查互联网连接,但总是遇到问题 我不是在寻找测试可用网络连接的代码——我已经找到了工作点——这是为了测试我是否可以访问互联网站点 (我很感激,如果我在一个显示登录屏幕而不是请求站点的系统后面,我可能无法得到我想要的确切结果,但我会在以后处理) 由于下面的问题,我想我已经取得了一些进展,但是当我运行应用程序时,它崩溃了(下面的错误信息) 到目前为止,我的代码如下(我必须承认,我发现try/catch的内容有点令人费解和乏味:-/) 我相信有更简洁的方法可以做到这一

我正在尝试从Android应用程序检查互联网连接,但总是遇到问题

我不是在寻找测试可用网络连接的代码——我已经找到了工作点——这是为了测试我是否可以访问互联网站点

(我很感激,如果我在一个显示登录屏幕而不是请求站点的系统后面,我可能无法得到我想要的确切结果,但我会在以后处理)

由于下面的问题,我想我已经取得了一些进展,但是当我运行应用程序时,它崩溃了(下面的错误信息)

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

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

当应用程序崩溃时,我得到的错误是:

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) 

正如David在评论中提到的,你应该在谷歌上搜索例外名称,并尝试自己扭转局面

通过查看他所指的,您需要在主线程之外进行所有网络通信。最常用的方法是创建一个异步任务

在您的情况下,它看起来(您可以创建一个新的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);
    }
}
您需要从活动中调用新的异步任务,方法是:

new InternetTask(this).execute();

同时确保将internet权限添加到您的清单中。

谢谢David。我在Android Studio中发现了错误报告(我对Java的唯一体验,因此它可能对所有Java IDE/编译器都很常见)-即使是确定要查找的错误,现在也证明是一件困难的事情,但是像这样的指针帮助我过滤出额外的信息,并关注异常的根本原因。哇,每次我觉得我用Java取得了进展,它就会抛出一个曲线球,使事情变得更加复杂。我可以理解不阻塞UI线程的原因,但我一辈子都无法弄清楚这与我正在尝试做的事情有什么关系(检查活动网络连接,然后检查互联网访问,然后在继续启动主应用程序活动之前检查特定URL的特定响应).经过一番思考,这个答案解释了我未能理解的问题。您在这里的解释使事情更容易理解,因为它没有被副本中的RSS问题所混淆。
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();
    }
}
new InternetTask(this).execute();