通过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     @Override
11     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     @Override
39     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了

最后,欢迎大家批评指正

猜你喜欢

转载自www.cnblogs.com/fightinglmq/p/12512567.html