我们都知道多线程应用在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 }
UI线程中的方法调用为:
GetAllStuffRecordTask task=new GetAllStuffRecordTask();task.setListener(new GetAllStaffRecordTask.OnResponseListener<List<StaffRecordBean>>() { @Override public void onResponse(List<StaffRecordBean> list) { //这里获得了所需要的数据,可以进行相应的操作了 }});task.execute();
这样就OK了
最后,欢迎大家批评指正