NetworkOnMainThread Exception即使使用AsyncTask也会抛出

时间:2014-01-14 22:22:31

标签: android

这是我的Fragment中的AsyncTask类,当我点击片段时,我收到此错误: NetworkOnMainThread异常(我无法发布图片,因为我的声誉不够高)

private class me extends AsyncTask<Object,Void,Boolean>{   
           DisplayMetrics dm = new DisplayMetrics();

           protected void onPreExecute(){
               String sess = SignIn.giveSession().getSession().getToken();


               deviceId = device.getDeviceId();
               data = RestQuery.profileImage(sessionToken, deviceId, username);
               bm = BitmapFactory.decodeByteArray(data,0,data.length);
               getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);


               username = reWiPr.getName();



           }

           protected Boolean doInBackground(Object... stuff){
               if(reWiPr == null){
                   return false;
               }

               return true;
           }

           protected void onPostExecute(Boolean results){
               if(results){
                   image.setMinimumHeight(dm.heightPixels);
                   image.setMinimumWidth(dm.widthPixels);
                   image.setImageBitmap(bm);

                   uName.setText(reWiPr.getName());
                   rName.setText(reWiPr.getRealName());
                   safety.setText("Safety: " + reWiPr.getRating().getSafe());
                   time.setText("Time: " + reWiPr.getRating().getTime());
                   courteous.setText("Courteous: " + reWiPr.getRating().getCourteous());
                   cleanliness.setText("Cleanliness: " + reWiPr.getRating().getClean());
                   overall.setText("Overall: " + reWiPr.getRating().getOverall());
                   average.setText("Average: " + reWiPr.getRating().getAverage());
                   ve.setText("Vehicles: " + reWiPr.getVehicle() );


               }
           }

我该如何解决这个问题?我需要这个AsyncTask来使片段工作,我在onCreate()方法中执行它。任何帮助将不胜感激。*

2 个答案:

答案 0 :(得分:3)

您没有使用正确的方法进行网络通话。您必须立即转移doInBackground中的onPreExecute网络电话。

来自文档:

  

执行异步任务时,任务将经历4个步骤:

     
      
  1. onPreExecute(),在任务之前在UI线程上调用   执行。例如,此步骤通常用于设置任务   通过在用户界面中显示进度条。
  2.   
  3. doInBackground(Params ...),在后台线程上调用   在onPreExecute()完成执行后立即执行。这一步是   用于执行可能需要很长时间的后台计算。   异步任务的参数将传递给此步骤。该   计算结果必须由此步骤返回并且将是   回到最后一步。这一步也可以使用   publishProgress(Progress ...)发布一个或多个单元   进展。这些值发布在UI线程中   onProgressUpdate(Progress ...)步骤。
  4.   
  5. onProgressUpdate(Progress ...),在调用后在UI线程上调用   发布进度(进度......)。执行的时间是   未定义。此方法用于显示任何形式的进度   后台计算仍然是用户界面   执行。例如,它可用于为进度条设置动画或   在文本字段中显示日志。
  6.   
  7. onPostExecute(Result),在后台后的UI线程上调用   计算结束。背景计算的结果是   作为参数传递给此步骤。
  8.   

答案 1 :(得分:0)

您需要使用doInBackground方法执行网络任务。目前,您在onPreExecute中运行GUI线程。