android.os.NetworkOnMainThreadException在AsynkTask类 [英] android.os.NetworkOnMainThreadException in AsynkTask Class

查看:215
本文介绍了android.os.NetworkOnMainThreadException在AsynkTask类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想与 JSON 来从网上得到的数据,我使用的是 AsynkTask 类做其工作,但如果我添加或更改任何
 code,然后再次运行我的程序停止与 android.os.NetworkOnMainThreadException 工作
但我从来不跑了主线程这个code,我必须在修复项目单击,然后清洁项目,然后再次运行,再次运行正常,请问是什么问题?
我的code的工作如下:

i want to get data from the internet with JSON, i'm using an AsynkTask class to do that and its working, but if i add or change any code and run my program again it stops working with android.os.NetworkOnMainThreadException But i never ran this code on the main thread, and i must click on fix project, then clean project and run again and it works fine again, what is the problem? My code that is working is as follows:

    public class NetworkDocStateThread extends AsyncTask<String, Void, Void> {

    HttpResponse responseState;

    @Override
    protected Void doInBackground(String... params) {

        try {
            responseState = JsonDocumnet
                    .SendDocumentState(Financial.selectedGuId);

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void post) {
        try {

            Financial.documnetStateDs = JsonDocumnet
                    .DocumentState(responseState);

                documentStateSpinner.add(Financial.documnetStateDs.get(i)
                        .getTitle());
            }

            SpinnerStateAdapter = new ArrayAdapter<String>(Documnet.this,
                    R.layout.spinnlayout, R.id.docstateid,
                    documentStateSpinner);


            SpinnerNumAdapter = new ArrayAdapter<String>(Documnet.this,
                    R.layout.spinnlayout, R.id.docstateid, getResources()
                            .getStringArray(R.array.numPerPage));

            SpinnerSortAdapter = new ArrayAdapter<String>(Documnet.this,
                    R.layout.spinnlayout, R.id.docstateid, getResources()
                    .getStringArray(R.array.SortBy));

            new NetworkDocThread().execute(Financial.selectedGuId, "5",

                    "0", "Id", "-1");

            docStateSpinner.setAdapter(SpinnerStateAdapter);
            NumberPerPageSpinner.setAdapter(SpinnerNumAdapter);
            SortBySpinner.setAdapter(SpinnerSortAdapter);

        } catch (IllegalStateException e) {

            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }

        super.onPostExecute(post);
    }

}

和第二类AsyncTask的:

and second AsyncTask class:

public class NetworkDocThread extends AsyncTask<String, Void, Void> {

    HttpResponse responseDoc;

    @Override
    protected Void doInBackground(String... s) {
        try {
            responseDoc = JsonDocumnet.SendDocumnet(s[0], s[1], s[2], s[3],
                    s[4]);

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void post) {


            try {
                Financial.docs = JsonDocumnet.Document(responseDoc);
                CreatingData();

            } catch (IOException e) { 
                e.printStackTrace();
            } catch (JSONException e) {
                ;
            }

            dialog.dismiss();


        }
    }
}

和清单文件:

   <uses-permission android:name="android.permission.INTERNET" />

和我的 LogCat中错误

    12-03 05:08:43.022: E/AndroidRuntime(1106): FATAL EXCEPTION: main
    12-03 05:08:43.022: E/AndroidRuntime(1106): android.os.NetworkOnMainThreadException
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:134)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:174)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at java.io.InputStreamReader.read(InputStreamReader.java:244)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at java.io.BufferedReader.fillBuf(BufferedReader.java:130)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at java.io.BufferedReader.readLine(BufferedReader.java:354)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at json.JsonDocumnet.Documen(JsonDocumnet.java:200)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at activity.Documnet$NetworkDocThread.onPostExecute(Documnet.java:375)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at activity.Documnet$NetworkDocThread.onPostExecute(Documnet.java:1)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at android.os.AsyncTask.finish(AsyncTask.java:631)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at android.os.Handler.dispatchMessage(Handler.java:99)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at android.os.Looper.loop(Looper.java:137)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at android.app.ActivityThread.main(ActivityThread.java:5041)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at java.lang.reflect.Method.invokeNative(Native Method)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at java.lang.reflect.Method.invoke(Method.java:511)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at dalvik.system.NativeStart.main(Native Method)

我使用的是2 AsynkTask 类,因为我需要在第二类中的第一类的数据,我不能做网络I / O在 onPostExecute 的AsyncTask

I'm using 2 AsynkTask classes because i need the data of the first class in the second class and I cannot do network I/O in onPostExecute of an AsyncTask.

编辑////////////////////

EDIT////////////////////

和Documen功能:

and Documen function:

    public static DocumentDS Documen(HttpResponse response) throws IOException, JSONException 
{
    String split[] ;
    List<DocumentInfoDS> dslis = new ArrayList<DocumentInfoDS>();
    split = response.getStatusLine().toString().split(" ");
    for (int i = 0 ; i < split.length ; i++)
    {
        Log.d("status code is", split[i]);
    }
    Log.d("status code is", split[1]);

    switch (Integer.valueOf(split[1])/100) 
    {           
    case 2:

        Log.d("IN Switch STATMENT", "2");
        in = new BufferedReader(new InputStreamReader(response
                    .getEntity().getContent()));


        StringBuffer sb = new StringBuffer("");
        String line = "";
        String NL = System.getProperty("line.separator");

        while ((line = in.readLine()) != null) {
            Log.d("line is", line);
            sb.append(line + NL);
        }

        Log.d("after setting data", "1234");
        in.close();
        json = sb.toString();

        JSONObject jsonObj = new JSONObject(json);
        docs = new DocumentDS();
        docs.SetDocCount(jsonObj.getInt(TAG_Count));
        JSONArray jsonArray = new JSONArray(jsonObj.getString(TAG_Docs));




        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject temp = jsonArray.getJSONObject(i);
            DocumentInfoDS ds = new DocumentInfoDS();

            ds.SetGuId(temp.getString(TAG_Id));
            ds.SetTitle(temp.getString(TAG_Title));
            ds.SetStateID(temp.getInt(TAG_StateId));
            ds.SetCreateDate( temp.getString(TAG_CreateDate));
            ds.SetDocumnetNumber(temp.getInt(TAG_DocumentNum));

            dslis.add(ds);
            }

        docs.SetList(dslis);



        Log.d("lenght is", String.valueOf(dslis.size()));
        break;
    }
    return docs;

线200,而((行= in.readLine())!= NULL)

line 200 is while ((line = in.readLine()) != null)

推荐答案

您只得到在doInBackground一个Htt的presponse的参考。但所有上的Htt presponse的读/写操作也涉及网络操作。你是从onPOstExecute(HTT presponse)运行在UI线程读取。并尝试这个...

You merely getting a reference of HttpResponse in doInBackground. but all the read/write operations on HttpResponse also involves network operation. and you are reading from HttpResponse in onPOstExecute() which runs in UI Thread. and try this...

public class NetworkDocStateThread extends AsyncTask<String, Void, Void> {


    @Override
    protected Void doInBackground(String... params) {

        try {
            HttpResponse responseState = JsonDocumnet
                    .SendDocumentState(Financial.selectedGuId);
            Financial.documnetStateDs = JsonDocumnet
                    .DocumentState(responseState);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void post) {
        try {


            documentStateSpinner.add(Financial.documnetStateDs.get(i)
                    .getTitle());

            SpinnerStateAdapter = new ArrayAdapter<String>(Documnet.this,
                    R.layout.spinnlayout, R.id.docstateid,
                    documentStateSpinner);

            SpinnerNumAdapter = new ArrayAdapter<String>(Documnet.this,
                    R.layout.spinnlayout, R.id.docstateid, getResources()
                            .getStringArray(R.array.numPerPage));

            SpinnerSortAdapter = new ArrayAdapter<String>(Documnet.this,
                    R.layout.spinnlayout, R.id.docstateid, getResources()
                            .getStringArray(R.array.SortBy));

            new NetworkDocThread().execute(Financial.selectedGuId, "5",

            "0", "Id", "-1");

            docStateSpinner.setAdapter(SpinnerStateAdapter);
            NumberPerPageSpinner.setAdapter(SpinnerNumAdapter);
            SortBySpinner.setAdapter(SpinnerSortAdapter);

        } catch (IllegalStateException e) {

            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }

        super.onPostExecute(post);
    }

}

这篇关于android.os.NetworkOnMainThreadException在AsynkTask类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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