【问题标题】:Excute URL get, Error when executing urlget执行url get,执行url get时出错
【发布时间】:2016-08-05 05:48:01
【问题描述】:

我想执行一个简单的 url get,我使用了这个链接中的代码 http://developer.android.com/reference/java/net/HttpURLConnection.html

我想在点击事件中运行这段代码:

URL url = new URL("http://www.android.com/");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
    InputStream in = new BufferedInputStream(urlConnection.getInputStream());
    readStream(in);}
finally {
    urlConnection.disconnect();
}

当我运行应用程序时,我收到了这个很长的错误:

E/AndroidRuntime: 致命异常: main 进程:com.example.soma.smsserver1,PID:20664 java.lang.IllegalStateException:无法执行 android:onClick 的方法 在 android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:289) 在 android.view.View.performClick(View.java:5198) 在 android.view.View$PerformClick.run(View.java:21147) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 引起:java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Method.invoke(本机方法) 在 android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284) 在 android.view.View.performClick(View.java:5198) 在 android.view.View$PerformClick.run(View.java:21147) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 引起:android.os.NetworkOnMainThreadException 在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273) 在 java.net.InetAddress.lookupHostByName(InetAddress.java:431) 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 在 java.net.InetAddress.getAllByName(InetAddress.java:215) 在 com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29) 在 com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188) 在 com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157) 在 com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100) 在 com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357) 在 com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340) 在 com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330) 在 com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248) 在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433) 在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384) 在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231) 在 com.example.soma.smsserver1.MainActivity$override.clickMe(MainActivity.java:28) 在 com.example.soma.smsserver1.MainActivity$override.access$dispatch(MainActivity.java) 在 com.example.soma.smsserver1.MainActivity.clickMe(MainActivity.java:0) 在 java.lang.reflect.Method.invoke(本机方法) 在 android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284) 在 android.view.View.performClick(View.java:5198) 在 android.view.View$PerformClick.run(View.java:21147) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

【问题讨论】:

  • this 线程上查看答案。您可能正在主 (UI) 线程上执行请求。您应该使用 AsyncTask 或 Volley 库在后台执行 http 请求。

标签: android android-networking


【解决方案1】:

android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)

您不能在主线程上处理网络,这是对 Android 的安全限制,请尝试将您的调用包装在 AsyncTask 中作为后台服务或线程。

请阅读有关Processes and Threads的文档

【讨论】:

    【解决方案2】:

    您正在 MainThread 上执行网络请求,这是被禁止的,因为它会在此调用期间阻塞 UI。 你应该使用另一个Thread 来做这个电话,你有不同的选择:ThreadAsyncTask,等等......

    这里有一些例子: http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

    【讨论】:

      【解决方案3】:

      您正在主线程上处理网络,这将使您的应用挂起,因此,您需要在 AsyncTask 等后台服务上处理长时间运行的任务 检查此链接https://www.upwork.com/hiring/mobile/why-you-should-use-asynctask-in-android-development/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-29
        • 2019-08-29
        • 2014-08-04
        • 2011-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        相关资源
        最近更新 更多