Android url.openStream() not working



我正试图从网站检索数据,我的应用程序不断崩溃。我已经将问题定位到openStream()命令。我使用的类定义如下。我不知道我做错了什么。任何建议都很感激。

private class MyAsyncTask extends AsyncTask<Void, Void, Void>{
//execute on background (out of the UI thread)
protected void doInBackground() {
URL url = null;
try {
url = new URL("URL is in here");
BufferedInputStream bis = new BufferedInputStream(url.openStream());
byte[] buffer = new byte[1024];
StringBuilder sb = new StringBuilder();
int bytesRead = 0;
while((bytesRead = bis.read(buffer)) > 0) {
String text = new String(buffer, 0, bytesRead);
sb.append(text);
}
bis.close();

} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected Void doInBackground(Void... arg0) {
// TODO Auto-generated method stub
return null;
}
}

在我的manifest文件中我有上网的权限。再次感谢您的帮助。

以下是logcat中显示的错误。

07-11 11:26:31.110: E/AndroidRuntime(9259): FATAL EXCEPTION: main07-11 11:26:31.110: E/AndroidRuntime(9259): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.annarbormap/com.example.annarbormap. com.com .example.annarbormap. com.example. com.MapActivity}: android.os.NetworkOnMainThreadException07:11 11:26:31.110: E/AndroidRuntime(9259): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2246)07-11 11:26:31.110: E/AndroidRuntime(9259): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2296)07-11 11:26:31.110: E/AndroidRuntime(9259): at android.app.ActivityThread.access$700(ActivityThread.java:151)07:11 11:26:31.110: E/AndroidRuntime(9259): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)07-11 11:26:31.110: E/AndroidRuntime(9259): at android.os.Handler.dispatchMessage(Handler.java:99)07-11 11:26:31.110: E/AndroidRuntime(9259): at android.os. loop .loop(loop .java:137)07:11 11:26:31.110: E/AndroidRuntime(9259): at android.app.ActivityThread.main(ActivityThread.java:5293)07-11 11:26:31.110: E/AndroidRuntime(9259): at java.lang.reflect.Method。invokeNative(本地方法)07-11 11:26:31.110: E/AndroidRuntime(9259): at java.lang.reflect.Method.invoke(Method.java:511)07-11 11:26:31.110: E/AndroidRuntime(9259): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)07-11 11:26:31.110: E/AndroidRuntime(9259): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)07-11 11:26:31.110: E/AndroidRuntime(9259): at dalvik.system. native . art. exe主要(本地方法)07-11 11:26:31.110: E/AndroidRuntime(9259): Caused by: android.os. networkonmainthreadeexception .日志示例07-11 11:26:31.110: E/AndroidRuntime(9259): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)07-11 11:26:31.110: E/AndroidRuntime(9259): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)07-11 11:26:31.110: E/AndroidRuntime(9259): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)07-11 11:26:31.110: E/AndroidRuntime(9259): at java.net.InetAddress.getAllByName(InetAddress.java:214)07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpConnection.(HttpConnection.java:70)07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpConnection.(HttpConnection.java:50)07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpsURLConnectionImpl$ httpengine . makesslconnection (HttpsURLConnectionImpl.java:461)07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpsURLConnectionImpl$ httpengine .connect(HttpsURLConnectionImpl.java:433)07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)07-11 11:26:31.110: E/AndroidRuntime(9259): at java.net.URL.openStream(URL.java:462)07-11 11:26:31.110: E/AndroidRuntime(9259): at com.example.annarbormap.MapActivity$MyAsyncTask.doInBackground(MapActivity.java:77)07-11 11:26:31.110: E/AndroidRuntime(9259): at com.example.annarbormap.MapActivity.onCreate(MapActivity.java:48)07-11 11:26:31.110: E/AndroidRuntime(9259): at android.app.Activity.performCreate(Activity.java:5250)07-11 11:26:31.110: E/AndroidRuntime(9259): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)07-11 11:26:31.110: E/AndroidRuntime(9259): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2210)07-11 11:26:31.110: E/AndroidRuntime(9259):…11个

networkonmainthreadeexception

你创建了你自己的doInBackground方法,但是互联网连接必须只在后台,把你的代码重写方法doInBackground !请看下面的例子:

在后台实现获取数据,在opPostExecute方法中设置数据给视图。

private class MyAsyncTask extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... arg0) {
URL url = null;
try {
url = new URL("URL is in here");
BufferedInputStream bis = new BufferedInputStream(url.openStream());
byte[] buffer = new byte[1024];
StringBuilder sb = new StringBuilder();
int bytesRead = 0;
while((bytesRead = bis.read(buffer)) > 0) {
String text = new String(buffer, 0, bytesRead);
sb.append(text);
}
bis.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return yourResult;
}
}

private class MyAsyncTask extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... arg0) {
doInBackground();   //your methods
return null;
}
protected void doInBackground() {
URL url = null;
try {
url = new URL("URL is in here");
BufferedInputStream bis = new BufferedInputStream(url.openStream());
byte[] buffer = new byte[1024];
StringBuilder sb = new StringBuilder();
int bytesRead = 0;
while((bytesRead = bis.read(buffer)) > 0) {
String text = new String(buffer, 0, bytesRead);
sb.append(text);
}
bis.close();

} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

希望,我能帮助你。

最新更新