Android url.openStream() 不工作 [英] Android url.openStream() not working

查看:56
本文介绍了Android url.openStream() 不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从网站检索数据,但我的应用程序不断崩溃.我已将问题归结为 openStream() 命令.我正在使用的类定义如下.我无法弄清楚我做错了什么.任何建议表示赞赏.

I am trying to retrieve data from a website and my app keeps crashing. I have located the issue down to the openStream() command. The class I am using is defined below. I am unable to figure out what I am doing wrong. Any advise is appreciated.

    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;
    }
}

我的清单文件中确实有 Internet 的权限.再次感谢您的帮助.

I do have permission for the Internet in my manifest file. Thanks again for any help.

以下是 logcat 中显示的错误.

Here are the errors displayed in logcat.

07-11 11:26:31.110:E/AndroidRuntime(9259):致命异常:主要07-11 11:26:31.110:E/AndroidRuntime(9259):java.lang.RuntimeException:无法启动活动组件信息{com.example.annarbormap/com.example.annarbormap.MapActivity}:android.os.NetworkOnMainThreadException07-11 11:26:31.110:E/AndroidRuntime(9259):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2246)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2296)07-11 11:26:31.110:E/AndroidRuntime(9259):在 android.app.ActivityThread.access$700(ActivityThread.java:151)07-11 11:26:31.110:E/AndroidRuntime(9259):在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)07-11 11:26:31.110:E/AndroidRuntime(9259):在 android.os.Handler.dispatchMessage(Handler.java:99)07-11 11:26:31.110:E/AndroidRuntime(9259):在 android.os.Looper.loop(Looper.java:137)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 android.app.ActivityThread.main(ActivityThread.java:5293)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 java.lang.reflect.Method.invokeNative(Native Method)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 java.lang.reflect.Method.invoke(Method.java:511)07-11 11:26:31.110:E/AndroidRuntime(9259):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)07-11 11:26:31.110:E/AndroidRuntime(9259):在 dalvik.system.NativeStart.main(Native Method)07-11 11:26:31.110:E/AndroidRuntime(9259):引起:android.os.NetworkOnMainThreadException07-11 11:26:31.110:E/AndroidRuntime(9259):在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 java.net.InetAddress.lookupHostByName(InetAddress.java:385)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 java.net.InetAddress.getAllByName(InetAddress.java:214)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 libcore.net.http.HttpConnection.(HttpConnection.java:70)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 libcore.net.http.HttpConnection.(HttpConnection.java:50)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 libcore.net.http.HttpConnection.connect(HttpConnection.java:128)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 java.net.URL.openStream(URL.java:462)07-11 11:26:31.110:E/AndroidRuntime(9259):在 com.example.annarbormap.MapActivity$MyAsyncTask.doInBackground(MapActivity.java:77)07-11 11:26:31.110:E/AndroidRuntime(9259):在 com.example.annarbormap.MapActivity.onCreate(MapActivity.java:48)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 android.app.Activity.performCreate(Activity.java:5250)07-11 11:26:31.110: E/AndroidRuntime(9259): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)07-11 11:26:31.110:E/AndroidRuntime(9259):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2210)07-11 11:26:31.110: E/AndroidRuntime(9259): ... 11 更多

07-11 11:26:31.110: E/AndroidRuntime(9259): FATAL EXCEPTION: main 07-11 11:26:31.110: E/AndroidRuntime(9259): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.annarbormap/com.example.annarbormap.MapActivity}: android.os.NetworkOnMainThreadException 07-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.Looper.loop(Looper.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(Native Method) 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.NativeStart.main(Native Method) 07-11 11:26:31.110: E/AndroidRuntime(9259): Caused by: android.os.NetworkOnMainThreadException 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$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461) 07-11 11:26:31.110: E/AndroidRuntime(9259): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.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 more

推荐答案

NetworkOnMainThreadException

NetworkOnMainThreadException

您创建了自己的 doInBackground 方法,但 Internet 连接必须仅在后台进行,请将您的代码置于覆盖方法 doInbackground 中!请参见下面的示例:

You created your own doInBackground methods, but Internet connection must be only in background, put your code to overrided methods doInbackground! See example below:

在后台实现获取数据,在方法 opPostExecute - 设置数据到视图.

In background implement getting data, in method opPostExecute - settings data to views.

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();
       }

   }

}

希望能帮到你.

这篇关于Android url.openStream() 不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆