Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AsynkTask类中的android.os.NetworkOnMainThreadException_Android_Android Asynctask - Fatal编程技术网

AsynkTask类中的android.os.NetworkOnMainThreadException

AsynkTask类中的android.os.NetworkOnMainThreadException,android,android-asynctask,Android,Android Asynctask,我想通过JSON从互联网上获取数据,我正在使用AsynkTask类来完成这项工作,但如果我添加或更改任何 编码并再次运行我的程序它将停止与android.os.NetworkOnMainThreadException一起工作 但是我从来没有在主线程上运行过此代码,我必须单击修复项目,然后清理项目并再次运行,它再次正常工作,这是什么问题? 我的代码如下所示: public class NetworkDocStateThread extends AsyncTask<String, Vo

我想通过
JSON
从互联网上获取数据,我正在使用
AsynkTask
类来完成这项工作,但如果我添加或更改任何 编码并再次运行我的程序它将停止与android.os.NetworkOnMainThreadException一起工作 但是我从来没有在
主线程上运行过此代码,我必须单击
修复项目
,然后
清理项目并再次运行,它再次正常工作,这是什么问题?
我的代码如下所示:

    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);
    }

}
我使用2个
AsynkTask
类,因为我需要第二个类中第一个类的数据,并且我无法在
AsyncTask
onPostExecute
中执行网络I/O

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

和文档功能:

    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;
publicstaticdocumentsddocumen(HttpResponse响应)抛出IOException、jsoneexception
{
字符串拆分[];
List dslis=new ArrayList();
split=response.getStatusLine().toString().split(“”);
对于(int i=0;i

第200行是while((line=in.readLine())!=null)

尝试在onCreate(Bundle)上添加以下代码


您仅在doInBackground中获取HttpResponse的引用。但HttpResponse上的所有读/写操作也涉及网络操作。您正在UI线程中运行的onPOstExecute()中读取HttpResponse。请尝试以下操作

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);
    }

}
公共类NetworkDocStateThread扩展异步任务{
@凌驾
受保护的Void doInBackground(字符串…参数){
试一试{
HttpResponse responseState=JsonDocumnet
.SendDocumentState(Financial.selectedGuId);
Financial.documnetstates=JsonDocumnet
.文件州(不动产);
}捕获(例外情况除外){
例如printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void post){
试一试{
documentStateSpinner.add(Financial.documnetstates.get(i)
.getTitle());
SpinnerStateAdapter=新阵列适配器(Documnet.this,
R.layout.spinnlayout,R.id.docstateid,
(旋转器);
SpinnerNumAdapter=新阵列适配器(Documnet.this,
R.layout.spinnlayout、R.id.docstateid、getResources()
.getStringArray(R.array.numPerPage));
SpinnerSortAdapter=新阵列适配器(Documnet.this,
R.layout.spinnlayout、R.id.docstateid、getResources()
.getStringArray(R.array.SortBy));
新建NetworkDocThread().execute(Financial.selectedGuId,“5”,
“0”、“Id”、“-1”);
setAdapter(SpinnerStateAdapter);
NumberPerPageSpinner.setAdapter(SpinnerNumAdapter);
设置适配器(喷丝头或适配器);
}捕获(非法状态){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}捕获(JSONException e){
e、 printStackTrace();
}
super.onPostExecute(post);
}
}

当您在主线程中执行网络连接任务(如从服务器获取数据)时,就会出现此问题。建议在
AsyncTask
doInbackground()
方法中执行此类任务,或者您也可以通过将下面的代码放在活动的
onCreate()
中来避免此问题:

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

我希望当您已经在主线程中编写了大量代码时,它能解决您的问题。

清单文件中的Internet权限?您是否授予Internet权限?这有什么作用
jsondocument.DocumentState(responseState)
?是的,如果我添加了该权限,请参阅我的Edit@Raghunandan读jason并写进Object这对我有什么作用?尝试添加它,这将处理异步任务进程。添加它并运行code@user406090这不是解决方案。应该将n/w相关操作移动到线程。实际上我已经遇到了这个问题,我将此代码放在后面,然后异步任务没有问题,测试时应该使用@user406090。要读取,必须从响应中获取InputStream。流中的数据来自网络。因此,读取涉及网络操作
    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;
@Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
    StrictMode.setThreadPolicy(policy);

//your code 
}
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);
    }

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