【问题标题】:In AsyncTask onPostExecute got NetworkOnMainThreadException error [duplicate]在 AsyncTask onPostExecute 得到 NetworkOnMainThreadException 错误 [重复]
【发布时间】:2014-02-10 18:41:07
【问题描述】:

我有异步任务来获取 json 数组以加载微调器。但是在 onPostExecute 我得到了 NetworkOnMainThreadException 错误。

//这里出错了

 while ((line = reader.readLine()) != null) 
 {
  builder.append(line) ;
 }

这是我的 onPostExecute。 response 是一个 Http 响应。这里有什么错误?

   protected void onPostExecute(String result) {

             BufferedReader reader;
            try {
    reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

                 StringBuilder builder = new StringBuilder();

                 String line = null;

                    //Error in here
                 while ((line = reader.readLine()) != null) 
                    {
                     builder.append(line) ;
                    }



                 JSONTokener tokener = new JSONTokener(builder.toString());
                 JSONArray finalResult = new JSONArray(tokener);

                 final String[] items = new String[finalResult.length()]; 

                    // looping through All Contacts
                    for(int i = 0; i < finalResult.length(); i++){

                        JSONObject c = finalResult.getJSONObject(i);

                        items[i]=c.getString("data_name");

                    }

                    ArrayAdapter<String> adapter = new ArrayAdapter<String> (activity, android.R.layout.simple_spinner_item, items);       

                    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

                    spin.setAdapter(adapter);



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


            super.onPostExecute(result);

            //activity.startActivity(new Intent(activity, wanted.class));


            if (dialog != null)
                 dialog.dismiss();   

        }

【问题讨论】:

  • 我看到的唯一需要在onPostExecute() 中的是Adapter 代码和Dialog 代码。其他一切都应该在doInBackground()
  • 不是另一个 NetworkOnMainThreadException!提问前请先搜索。每周出现 10 次。
  • 问题已解决。

标签: android android-asynctask bufferedreader stringbuilder


【解决方案1】:

你应该移动你的:

reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// ..
while ((line = reader.readLine()) != null) 

AsyncTask.doInBackground()

这是您的网络操作必须发生的地方,onPostExecute 在 UI 线程上

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2012-06-15
    • 2017-07-23
    • 1970-01-01
    相关资源
    最近更新 更多