-3

此错误仅在模拟器上发生,但完全在移动设备上运行...

错误

07-30 05:38:09.024: E/AndroidRuntime(941): android.os.NetworkOnMainThreadException

07-30 05:38:09.024: E/AndroidRuntime(941):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)

07-30 05:38:09.024: E/AndroidRuntime(941):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)

07-30 05:38:09.024: E/AndroidRuntime(941):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127)

07-30 05:38:09.024: E/AndroidRuntime(941):  at libcore.io.IoBridge.connect(IoBridge.java:112)

07-30 05:38:09.024: E/AndroidRuntime(941):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)

07-30 05:38:09.024: E/AndroidRuntime(941):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)

07-30 05:38:09.024: E/AndroidRuntime(941):  at java.net.Socket.connect(Socket.java:842)

07-30 05:38:09.024: E/AndroidRuntime(941):  at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)

07-30 05:38:09.024: E/AndroidRuntime(941):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)

07-30 05:38:09.024: E/AndroidRuntime(941):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)

07-30 05:38:09.024: E/AndroidRuntime(941):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)

07-30 05:38:09.024: E/AndroidRuntime(941):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)

07-30 05:38:09.024: E/AndroidRuntime(941):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)

07-30 05:38:09.024: E/AndroidRuntime(941):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)

07-30 05:38:09.024: E/AndroidRuntime(941):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
4

2 回答 2

3

您不能在 Honeycombe 的 UI 线程上执行网络 IO。从技术上讲,这在早期版本的 Android 上是可能的,但这是一个非常糟糕的主意,因为它会导致您的应用程序停止响应,并可能导致操作系统因您的应用程序行为不端而杀死您的应用程序。您需要运行后台进程或使用 AsyncTask 在后台线程上执行网络事务。

但是,如果您想强制您的应用程序执行此操作,请使用以下代码,

if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();

            StrictMode.setThreadPolicy(policy);
        }

但同样不推荐使用。阅读此链接以获取更多信息。

于 2013-07-30T06:33:52.583 回答
1

这个错误是因为主线程上的网络相关操作,从android ICS版本开始,网络相关代码应该运行在AsyncTask ..

private class MyTask extends AsyncTask<Void , Void, Void > {

   private Exception exception;

   protected Void doInBackground(Void... urls) {      
      // your code here    
   }

   protected void onPostExecute(Void feed) {

   }
}

像这样调用异步任务

MyTask task = new MyTask ();
task.execute();
于 2013-07-30T06:31:23.030 回答