首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使使用AsyncTask也会引发NetworkOnMainThread异常

即使使用AsyncTask也会引发NetworkOnMainThread异常
EN

Stack Overflow用户
提问于 2014-01-15 06:22:31
回答 2查看 88关注 0票数 0

下面是我的片段中的AsyncTask类,当我点击片段时,我得到了这个错误: NetworkOnMainThread异常(我不能发布图片,因为我的声誉不够高)

代码语言:javascript
复制
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()方法中执行它。任何帮助都将非常感谢。*

EN

回答 2

Stack Overflow用户

发布于 2014-01-15 06:25:15

您没有使用正确的方法进行网络调用。你必须将你的网络调用转移到doInBackground中,我看到它现在已经在onPreExecute中了。

从文档中:

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

在执行任务之前在UI线程上调用的

  1. onPreExecute(),。此步骤通常用于设置任务,例如,在onPreExecute()完成执行后立即在后台线程上调用的用户interface.
  2. doInBackground(Params...),中显示进度条。此步骤用于执行可能需要较长时间的后台计算。将异步任务的参数传递到此步骤。计算的结果必须由这一步返回,并将传递回最后一步。此步骤还可以使用publishProgress(Progress...)发布一个或多个进度单位。这些值发布在UI线程的onProgressUpdate中(Progress...)在调用publishProgress之后在UI线程上调用了step.
  3. onProgressUpdate(Progress...),(进度...)。执行的时间未定义。此方法用于在后台计算仍在执行时在用户界面中显示任何形式的进度。例如,它可以用于在后台计算完成后在UI线程上调用的文本field.
  4. onPostExecute(Result),中显示进度条或显示日志。后台计算的结果将作为参数传递到此步骤。
票数 3
EN

Stack Overflow用户

发布于 2014-01-15 06:25:31

您需要在doInBackground方法中执行网络任务。目前你有onPreExecute,它运行在GUI线程上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21125254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档