Android NetworkOnMainThreadException

时间:2013-09-12 09:42:24

标签: android sockets http httpresponse

当我尝试从我的PC主机中检索JSON数据时,我得到了android.os.NetworkOnMainThreadException,这是我的代码

public JSONObject getJSONObject(String url)
{
    Log.v("", "enter");
    DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
    Log.v("", "httpclient");
    HttpPost httppost = new HttpPost(url);
    Log.v("", "httppost");
    httppost.setHeader("Content-type", "application/json");
    Log.v("", "setHeader");
    InputStream inputStream = null;
    HttpResponse response;
    try
    {
            response = httpclient.execute(httppost);
            Log.v("", "response");
            HttpEntity entity = response.getEntity();
            Log.v("", "entity");
            inputStream = entity.getContent();
            Log.v("", "inputStream");
            Log.v("", buildJSONString( inputStream ));
            return new JSONObject( buildJSONString( inputStream ) );
    }
}

来自活动的电话

JSONObject jObject = (new JSONParser(this))
                .getJSONObject("http://192.168.0.81:8080/content/test.json");

和我的logcat

09-12 12:32:05.878: V/(11103): enter
09-12 12:32:05.878: V/(11103): httpclient
09-12 12:32:05.878: V/(11103): httppost
09-12 12:32:05.878: V/(11103): setHeader
09-12 12:32:05.878: W/System.err(11103): android.os.NetworkOnMainThreadException
09-12 12:32:05.888: W/System.err(11103):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1108)
09-12 12:32:05.888: W/System.err(11103):    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
09-12 12:32:05.888: W/System.err(11103):    at libcore.io.IoBridge.connectErrno(IoBridge.java:133)
09-12 12:32:05.888: W/System.err(11103):    at libcore.io.IoBridge.connect(IoBridge.java:118)
09-12 12:32:05.888: W/System.err(11103):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
09-12 12:32:05.888: W/System.err(11103):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
09-12 12:32:05.888: W/System.err(11103):    at java.net.Socket.connect(Socket.java:849)
09-12 12:32:05.888: W/System.err(11103):    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
09-12 12:32:05.888: W/System.err(11103):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:154)
09-12 12:32:05.888: W/System.err(11103):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
09-12 12:32:05.888: W/System.err(11103):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
09-12 12:32:05.888: W/System.err(11103):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
09-12 12:32:05.888: W/System.err(11103):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:580)
09-12 12:32:05.888: W/System.err(11103):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:512)
09-12 12:32:05.888: W/System.err(11103):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:490)
09-12 12:32:05.888: W/System.err(11103):    at com.dwaik.jsonparser.JSONParser.getJSONObject(JSONParser.java:72)

它说我的例外是response = httpclient.execute(httppost); 我获得了互联网许可,访问服务器实际上我可以在同一个应用程序中从它下载文件 有什么想法吗?

2 个答案:

答案 0 :(得分:3)

不允许使用主(UI)主题进行网络操作。

有几种使用后台线程的方法。 我建议使用 AsyncTask ,因为它有一个很容易理解的漂亮结构。

http://developer.android.com/reference/android/os/AsyncTask.html

这也是一个例子:AsyncTask Android example

Google上应该提供更多功能。

答案 1 :(得分:2)

Android NetworkOnMainThreadException

因为您在n/w operations

上正在执行 main Ui thread

使用 AsyncTaskThread

AsyncTask: Docs

class myAsync extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub

                // Keep in mind You Can't Update UI Part here

              JSONObject jObject = (new JSONParser(this))
                .getJSONObject("http://192.168.0.81:8080/content/test.json");
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
                // Handle/Update UI Part
        }
    }

称之为

new myAsync().execute();