通过AsyncTask访问后台后得到的返回数据在Android端显示
Posted 正在努力的girl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过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了
最后,欢迎大家批评指正
以上是关于通过AsyncTask访问后台后得到的返回数据在Android端显示的主要内容,如果未能解决你的问题,请参考以下文章