您的位置 首页 数字

Android异步使命处理

移动护理系统开发采用异步处理的方式,可以缩短执行操作的时间,避免UI线程阻塞。笔者介绍了采用异步处理方式开发移动护理程序的方法,并以移动护理中的病人列表异步任务处理为例进行分析。

移动护理体系开发选用异步处理的办法,能够缩短履行操作的时刻,防止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…)来改动当时的进展值。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/190682.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部