果冻豆中的NetworkOnMainThreadException错误[重复]

Posted

技术标签:

【中文标题】果冻豆中的NetworkOnMainThreadException错误[重复]【英文标题】:NetworkOnMainThreadException error in jellybean [duplicate] 【发布时间】:2012-08-09 06:00:57 【问题描述】:

在过去一周左右的时间里,我一直在努力让它工作,但仍然不知道问题出在哪里。它适用于android 2.1,但不适用于4.1。我在检查我的应用程序更新的服务中得到了这个字符串。

latestVersion = Integer.parseInt(getHttpString(urlLatestVersion));

它在 checkForUpdate() 中调用;在 onStart(Intent intent, int startId); 中调用。

private String getHttpString(String urlString) throws IOException 
            InputStream in = null;
            int response = -1;

            URL url = new URL(urlString);
            URLConnection conn = url.openConnection();

            if (!(conn instanceof HttpURLConnection))
                    throw new IOException("Not an HTTP connection");

            try 
                    HttpURLConnection httpConn = (HttpURLConnection) conn;
                    httpConn.setAllowUserInteraction(false);
                    httpConn.setInstanceFollowRedirects(true);
                    httpConn.setRequestMethod("GET");
                    httpConn.connect();

                    response = httpConn.getResponseCode();
                    if (response == HttpURLConnection.HTTP_OK) 
                            in = httpConn.getInputStream();
                    
             catch (Exception ex) 
                    ex.printStackTrace();
                    //
                    //main error currently lies here
                    // TODO fix errors that accures on android 4.0 and above.
                    //
            
            if (in != null) 
                    StringBuilder sb = new StringBuilder();
                    String line;

                    try 
                            BufferedReader reader = new BufferedReader(
                                            new InputStreamReader(in, "UTF-8"));
                            while ((line = reader.readLine()) != null) 
                                    sb.append(line); // .append("\n");
                            
                     finally 
                            in.close();
                    
                    return sb.toString();
             else
                    return "";

    

这是来自 logcat 的错误

W/System.err( 7077): android.os.NetworkOnMainThreadException
W/System.err( 7077):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
W/System.err( 7077):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
W/System.err( 7077):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
W/System.err( 7077):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
W/System.err( 7077):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
W/System.err( 7077):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
W/System.err( 7077):    at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:341)
W/System.err( 7077):    at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
W/System.err( 7077):    at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
W/System.err( 7077):    at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
W/System.err( 7077):    at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
W/System.err( 7077):    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
W/System.err( 7077):    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
W/System.err( 7077):    at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
W/System.err( 7077):    at com.lukemovement.roottoolbox.pro.Update.getHttpString(Update.java:166)
W/System.err( 7077):    at com.lukemovement.roottoolbox.pro.Update.checkForUpdate(Update.java:98)
W/System.err( 7077):    at com.lukemovement.roottoolbox.pro.Update.onStart(Update.java:75)
W/System.err( 7077):    at android.app.Service.onStartCommand(Service.java:450)
W/System.err( 7077):    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2620)
W/System.err( 7077):    at android.app.ActivityThread.access$1900(ActivityThread.java:143)
W/System.err( 7077):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1306)
W/System.err( 7077):    at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err( 7077):    at android.os.Looper.loop(Looper.java:137)
W/System.err( 7077):    at android.app.ActivityThread.main(ActivityThread.java:4935)
W/System.err( 7077):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err( 7077):    at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err( 7077):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
W/System.err( 7077):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
W/System.err( 7077):    at dalvik.system.NativeStart.main(Native Method)
I/Example update( 7077): Invalid int: ""

那么 android 是否已经放弃了向后兼容,或者只是忘记了添加这一点?

我读到我需要使用 AsyncTask。但我似乎无法让它为我工作,有人可以帮我解决这个问题吗?

【问题讨论】:

您可能已经意识到,您需要异步/多线程。你试过什么?你有什么问题? 在onStart void上的孔上做了一个线程。解决了这个问题。只是尽管如此。 【参考方案1】:

只需将此代码添加到您调用 Asynck 的活动的 oncreate 中。

代码:-

StrictMode.ThreadPolicy policy =
    new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

【讨论】:

API 8 的等效代码是什么?【参考方案2】:

从 Android API v15 开始,它不需要在主线程上运行繁重的进程。 所以你应该把你的逻辑移到另一个线程,比如下面的源代码:

new Thread(new Runnable() 
   public void run() 
        // your logic
                           
).start();

更多信息请参考:Responsiveness

【讨论】:

在回复您的回答时,我只是想知道为什么我得到了与此人相同的异常。我把我的代码放在异步任务中,它不是在主线程中启动的,而是在另一个线程中启动的,我需要点击一个按钮才能进入它。我使用 api 级别 14 和 17。

以上是关于果冻豆中的NetworkOnMainThreadException错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

果冻豆和冰淇淋三明治中的android数字选择器默认设计更改

比较果冻脚本中的2个变量

语音识别中的果冻豆哔声

果冻豆搜索键

万彩动画大师教程 | 实现文字及图片的果冻弹性的强调动画效果

Android -------- BouncingJellyView 果冻视图(阻尼效果)