Android url.openStream()无效

时间:2013-07-11 15:12:50

标签: android performance url

我正在尝试从网站检索数据,而我的应用程序一直在崩溃。我已将问题定位到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;
    }
}

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

以下是logcat中显示的错误。

  

07-11 11:26:31.110:E / AndroidRuntime(9259):致命异乎寻常:主要   07-11 11:26:31.110:E / AndroidRuntime(9259):java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.annarbormap / com.example.annarbormap.MapActivity}:android.os.NetworkOnMainThreadException   07-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):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):引起:android.os.NetworkOnMainThreadException   07-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):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):在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 more

1 个答案:

答案 0 :(得分:4)

NetworkOnMainThreadException

您创建了自己的doInBackground方法,但Internet连接必须只在后台,将您的代码置于覆盖方法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();
       }

   }

}

希望,我帮助你。