×

基于android采用异步处理方式开发移动护理程序的设计

消耗积分:1 | 格式:rar | 大小:0.6 MB | 2017-10-26

分享资料个

移动护理系统开发采用异步处理的方式,可以缩短执行操作的时间,避免UI线程阻塞。笔者介绍了采用异步处理方式开发移动护理程序的方法,并以移动护理中的病人列表异步任务处理为例进行分析。
  任务分析
  移动护理开发初期,对一些比较耗时的操作,我们没有考虑异步任务处理的方式,造成程序假死的问题,用户执行某个操作后十几秒程序才有反应,严重影响用户体验。现在程序已支持异步任务处理,本文将简单介绍移动护理中异步任务处理方式。
  移动护理系统通过访问网络获取数据,在获取数据过程中,访问网络和解析大量XML数据是不可避免的,这个过程需要耗费较长的时间,在我们未采用异步任务处理之前,执行一个操作需要等待5-10秒甚至更长的时间,这样程序就得等待很久才能正常操作。一般情况下,网络连接、XML解析、数据库访问都会造成这种长时间等待。
  原因很简单,当一个程序第一次启动时,Android会同时启动一个对应的主线程,主线程主要负责处理与UI相关的事件,如:用户的按键事件、用户触摸屏幕的事件等,并把相关的时间分发到对应的组件进行处理,这个主线程也叫UI线程。我们之前的方式就是使用UI线程完成所有操作,包括UI事件处理、网络连接、解析XML,这样就会造成UI阻塞,表现为程序假死的现象。
  为了解决程序假死的问题,我们必须使用异步任务处理,以确保在UI线程只处理UI事件,避免UI线程阻塞。
  解决方案
  Android 1.5已经提供了一个工具类——AsyncTask,使用AsyncTask可以是创建需要与用户界面交互的长时间运行的任务变得更简单,所以我们使用它来处理网络访问、XML解析这两个耗时操作来避免移动护理程序假死的问题。
  AsyncTask 是一个抽象类,他提供了三个泛型参数,详细如下
  AsyncTask的三个泛型参数
  1. Param 任务执行需要的参数
  2. Progress 后台任务执行的进度单位数据
  3. Result 后台任务执行最终返回的数据类型
  注意:在设置参数时通畅是:String …params,这表示方法可以有0个或多个String类型的参数;不使用参数时可设置为 Void…
  使用AsyncTask类,必须重载AsyncTask的四个方法(至少重载一个)。详细如下:
  AsyncTask的四个方法
  1. onPreExecute() 这个方法主要用于执行一些预处理操作,它运行于UI线程,一般用来为后台任务做一些准备工作,如在界面上显示一个进度条。
  2. doInBackground() 这个方法运行在后台线程中,主要负责执行那些很耗时的操作,如移动护理系统中的网络连接、解析XML等操作。这个方法在onPreExecute()方法后执行,该方法是抽象方法,也是AsyncTask的关键,所以该方法必须重载。另外,在这个方法中可以使用 publishProgress(Progress…)来改变当前的进度值。
  3. doProgressUpdate(Progress…) 这个方法运行于UI线程。如果在doInBackground(Params…)中使用了publishProgress(Progress…),UI线程就会调用这个方法对进度条控件的进度值进行控制。
  4. onPostExecute(Result) 这个方法也运行于UI线程,在doInBackground(Params…)方法执行后调用,该方法用于处理后台任务执行后返回的结果。
  实例解析
  以移动护理中的病人列表异步任务处理为例:
  @Override
  protected void onPreExecute() {
  super.onPreExecute();
  // 获取Wifi网络连接状态
  isNetWorkConnected = NetWorkActivity
  .isNetworkAvailable(PatiListActivity.this);
  if (isNetWorkConnected)
  // 弹出提示对话框
  mDialog.show();
  }
  onPreExecute()方法主要用于检查网络连接是否成功,如果成功则弹出进度条对话框。该方法运行于UI线程。
  @Override
  protected Object doInBackground(Object.。. arg0) {
  if (isNetWorkConnected) {
  // 获取病人列表数据
  patientList = getPatiList();
  }
  return null;
  }
  doInBackground()方法主要进行网络访问和XML解析,以获取病人列表数据,它运行于后台线程。这里没有调用 publishProgress() 方法,因为我们的进度条不需要显示百分比,因此我们也没必要重载doProgressUpdate(Progress…)方法。
  @Override
  protected void onPostExecute(Object result) {
  super.onPostExecute(result);
  if (isNetWorkConnected) {
  try {
  // 加载页面控件
  drawPage();
  // 关闭提示对话框
  mDialog.dismiss();
  } catch (Exception e) {
  e.printStackTrace();
  Toast.makeText(PatiListActivity.this, errorMsg,
  Toast.LENGTH_SHORT).show();
  }
  }
  }
  OnPostExecute()运行于UI线程,通过doInBackgroud()方法获取的病人列表来加载页面控件,完成后关闭对话框。至此,异步任务处理整个过程结束。
 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !