我在使用 HttpUrlConnection 类时遇到 Android 问题,我的方法是这样的:
public InputStream test() {
URL url = null;
try {
url = new URL("http://www.android.com/");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
HttpURLConnection urlConnection = null;
try {
urlConnection = (HttpURLConnection) url.openConnection();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
InputStream in= null;
try {
in = new BufferedInputStream(urlConnection.getInputStream());
}catch(IOException e){
e.printStackTrace();
}
finally {
urlConnection.disconnect();
}
return in;
}
当我执行此方法时,android 会生成此异常:
05-03 15:15:19.116: W/System.err(1085): android.os.NetworkOnMainThreadException 05-03 15:15:19.116: W/System.err(1085): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 05-03 15:15:19.116: W/System.err(1085): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 05-03 15:15:19.116: W/System.err(1085): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 05-03 15:15:19.116: W/System.err(1085): at java.net.InetAddress.getAllByName(InetAddress.java:220) 05-03 15:15:19.126: W/System.err(1085): at libcore.net.http.HttpConnection.(HttpConnection.java:71) 05-03 15:15:19.126: W/System.err(1085): at libcore.net.http.HttpConnection.(HttpConnection.java:50) 05-03 15:15:19.126: W/System.err(1085): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 05-03 15:15:19.126: W/System.err(1085): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 05-03 15:15:19.126: W/System.err(1085): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 05-03 15:15:19.126: W/System.err(1085): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 05-03 15:15:19.126: W/System.err(1085): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303) 05-03 15:15:19.126: W/System.err(1085): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 05-03 15:15:19.126: W/System.err(1085): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 05-03 15:15:19.126: W/System.err(1085): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 05-03 15:15:19.136: W/System.err(1085): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 05-03 15:15:19.136: W/System.err(1085): at com.BertacchiMazzoni.HTTPClient.HttpClientTutorial.test(HttpClientTutorial.java:35) 05-03 15:15:19.136: W/System.err(1085): at com.BertacchiMazzoni.HTTPClient.HTTPClientActivity.onCreate(HTTPClientActivity.java:18) 05-03 15:15:19.136: W/System.err(1085): at android.app.Activity.performCreate(Activity.java:4465) 05-03 15:15:19.136: W/System.err(1085): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 05-03 15:15:19.136: W/System.err(1085): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 05-03 15:15:19.136: W/System.err(1085): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 05-03 15:15:19.136: W/System.err(1085): at android.app.ActivityThread.access$600(ActivityThread.java:123) 05-03 15:15:19.136: W/System.err(1085): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 05-03 15:15:19.146: W/System.err(1085): at android.os.Handler.dispatchMessage(Handler.java:99) 05-03 15:15:19.146: W/System.err(1085): at android.os.Looper.loop(Looper.java:137) 05-03 15:15:19.146: W/System.err(1085): at android.app.ActivityThread.main(ActivityThread.java:4424) 05-03 15:15:19.146: W/System.err(1085): at java.lang.reflect.Method.invokeNative(Native Method) 05-03 15:15:19.146: W/System.err(1085): at java.lang.reflect.Method.invoke(Method.java:511) 05-03 15:15:19.146: W/System.err(1085): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 05-03 15:15:19.146: W/System.err(1085): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 05-03 15:15:19.146: W/System.err(1085): at dalvik.system.NativeStart.main(Native Method)
我可以解决这个问题吗?错误在哪里?
非常感谢! 问候!
最佳答案
快速谷歌一下异常情况,你会看到这里:http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html
其中规定:
The exception that is thrown when an application attempts to perform a networking operation on its main thread.
This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged. See the document Designing for Responsiveness.
所以基本上我猜测您正在主应用程序线程上执行网络操作;对于 Honeycomb 及以上版本,您似乎无法做到这一点。无论如何,这都是一个坏主意,因为它可能会使您的应用程序挂起并显得无响应。您需要使用另一个线程或处理程序或 asynctask 或 Loader 来执行该操作。
关于java - HttpUrlConnection fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10432344/