移动护理体系开发选用异步处理的办法,能够缩短履行操作的时刻,防止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线程,一般用来为后台使命做一些准备工作,如在界面上显现一个进展条。
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()办法获取的患者列表来加载页面控件,完结后封闭对话框。至此,异步使命处理整个进程完毕。
2. doInBackground() 这个办法运转在后台线程中,首要担任履行那些很耗时的操作,如移动护理体系中的网络连接、解析XML等操作。这个办法在onPreExecute()办法后履行,该办法是笼统办法,也是AsyncTask的要害,所以该办法有必要重载。别的,在这个办法中能够运用 publishProgress(Progress…)来改动当时的进展值。