标签:ons async 获取 override except 解析 lis 定义 int
我们都知道多线程应用在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 }
UI线程中的方法调用为:
GetAllStuffRecordTask task=new GetAllStuffRecordTask(); task.setListener(new GetAllStaffRecordTask.OnResponseListener<List<StaffRecordBean>>() { @Override public void onResponse(List<StaffRecordBean> list) { //这里获得了所需要的数据,可以进行相应的操作了 } }); task.execute();
这样就OK了
最后,欢迎大家批评指正
通过AsyncTask访问后台后得到的返回数据在Android端显示
标签:ons async 获取 override except 解析 lis 定义 int
原文地址:https://www.cnblogs.com/fightinglmq/p/12512567.html