通过AsyncTask访问后台后得到的返回数据在Android端显示

我们都知道多线程应用在Android开发中很常见,AsynTask就可以实现多线程,它可以在工作线程中执行一些耗时任务。

之前学习Android编程的时候就遇到了一个问题,当通过AsynTask来实现对后台数据的请求时,想要将获取到的数据显示在UI线程中。这有一个前提就是必须工作线程中的这个耗时任务执行完,UI线程才能进行得到这些数据,来填充界面,否则的话可能会出现耗时任务还没有执行完,导致UI线程中对应的数据为null。

解决的办法就是在继承AsynTask的类中增加一个类似于监听器的接口。

下面写一个示例:

比如Android前端希望获得全部员工的信息

首先要编写GetAllStuffRecordTask继承AsynTask

 1 public class GetAllStaffRecordTask extends AsyncTask<String,String ,List<StaffRecordBean>> { 2 private List<StaffRecordBean> list; 3 private OnResponseListener<List<StaffRecordBean>> listener;  4  5 public GetAllStaffRecordTask() { 6  } 7 public void setListener(OnResponseListener<List<StaffRecordBean>> listener) {  8 this.listener = listener;  9  }10  @Override11 protected List<StaffRecordBean> doInBackground(String... strings) {12 13 //通过网络访问服务器端登录功能14 URL url = null;15 try {16 17 String urlStr = "http://*****/staff/findallstaffrecord";18 url = new URL(urlStr);19 HttpURLConnection connection = (HttpURLConnection)url.openConnection();20 connection.setRequestProperty("contentType","utf-8");//如果给服务器端传的字符有中文,防止字符乱码问题21 InputStream is = connection.getInputStream();22 InputStreamReader inputStreamReader = new InputStreamReader(is);//转换流23 BufferedReader reader = new BufferedReader(inputStreamReader);24 String res = reader.readLine();25 Log.e("res",res);26 //解析一个JSON格式的字符串27 Gson gson = new Gson();28 list= gson.fromJson(res, new TypeToken<List<StaffRecordBean>>(){}.getType());29 Log.e("得到的list",list.toString());30 } catch (MalformedURLException e) {31  e.printStackTrace();32 } catch (IOException e) {33  e.printStackTrace();34  }35 return list;36 37  }38  @Override39  protected void onPostExecute(List<StaffRecordBean> lists ) { 40 super.onPostExecute(lists); 41 if (listener!=null){ 42  listener.onResponse(lists);43  }44  }45 //接口 类似一个监听事件46  public interface OnResponseListener<T>{ 47  void onResponse(T t); 48  }49 }
  • 代码详解:主要就是增加了橙色的部分
  • 第一步:定义一个类似于监听器的接口,也就是代码的46~48行
  • 第二步:在类中设置一个OnResponseListener<T> 类型的监听器对象(代码第3行)取名为listener,这里T设置为了List<StaffRecordBean>
  • 第三步:设置listener的set方法(代码7~9)行
  • 第四步,实现该类的onPostExcute()方法,将需要返回的列表lists设置成为返回数据(代码39~44行)

 

UI线程中的方法调用为:

GetAllStuffRecordTask task=new GetAllStuffRecordTask();task.setListener(new GetAllStaffRecordTask.OnResponseListener<List<StaffRecordBean>>() { @Override public void onResponse(List<StaffRecordBean> list) { //这里获得了所需要的数据,可以进行相应的操作了 }});task.execute();

这样就OK了

 

最后,欢迎大家批评指正

 

相关文章