您的位置:首页 > 移动开发 > Android开发

Android学习杂记(二):异步任务AsyncTask详解

2018-03-13 16:57 387 查看
学习了一段时间的android,对于异步任务机制还是一知半解,这次又碰到大量需要异步任务操作的代码,所以趁这个时间整理一下,加深一下认识。
AsyncTask是一个抽象类,在android.os包下,直接继承Object类,用于给创建的类继承。其完整类名和参数如下:
    AsyncTask<Params, Progress, Result>
其中:
-Params:这是异步任务开始时传入的参数类型。
-Progress:异步任务在执行异步操作的时候的进度。
-Result:异步任务操作结束时返回的参数。
AsyncTask有几个方法需要重写,最主要最常用的从调用顺序来分为如下几个:
protect void onPreExecute():该方法是在AsyncTask.execute()方法之前调用,一般用于UI界面的刷新,如进度条的显示。翻看源码,在该方法前找到有 @MainThread 的标志,说明该方法在主线程执行。
protect abstract Result doInBackground(Params... params):在调用onPreExecute()方法之后,任务正式进入主要操作,该操作顾名思义,就是在后台进行操作,此时查看Android源码,会发现有 @WorkerThread 的标志,这意味着该方法不在主线程操作,故不会阻塞主线程。parmas 为异步任务操作输入的参数,注意是Params... 这是一个数组,若只传入单个参数,则需要调用params[0]即可得到该参数。在这个方法中,可以通过publishProgress(Progress... values)来调用onProgressUpdate()方法,进行进度的更新。
protect void onProgressUpdate(Progress... values):在刚刚那个方法之中,调用了publishProgress(Progress...)方法,此时系统调用onProgressUpdate(Progress...)方法,该方法也有 @MainThread 标志,故一般用于主界面的刷新,多用于进度条的刷新。
protect void onPostExecute(Result result):该方法是在任务操作结束时回调的函数,使用的参数是doInBackground()方法中返回的参数。
实例如下,创建一个类继承AsyncTask,private class DownloadTask extends AsyncTask<Void, Integer, String>{

ProgressDialog progressDialog;
@Override
protected void onPostExecute(String s)
{
super.onPostExecute(s);
tv.setText(s);
progressDialog.dismiss();

}

@Override
protected void onPreExecute()
{
super.onPreExecute();
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setTitle("任务正在执行");
progressDialog.setMax(100);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setIndeterminate(false);
progressDialog.show();
}

@Override
protected void onProgressUpdate(Integer... values)
{
super.onProgressUpdate(values);
progressDialog.setProgress(values[0]);
}

@Override
protected String doInBackground(Void... params)
{
int i;
for (i = 0; i < 100; i++)
{
try
{
Thread.sleep(500);
} catch (InterruptedException e)
{
e.printStackTrace();
}
publishProgress(i);
}
if (i == 100){
return "成功";
}else
return "失败";
}
}使用以下操作来进行异步任务:DownloadTask task = new DownloadTask();
task.execute();如实例所示,在onPreExecute()方法中进行主界面的更新,调出进度条对话框,显示进度条对话框,设置进度条的各个参数。然后系统调用doInBackground()方法,实现里面模拟下载的操作,利用一个Thread.sleep()方法时线程在每数一次数的时候休眠半秒,模拟下载的操作,与此同时,调用publishProgress()方法让系统调用onProgressUpdate()方法,传入Progress参数,实现onProgressUpdate()里面重写的操作。在操作结束,doInBackground()返回一个值时,系统调用onPostExecute()方法。
注意:onPreExecute(),doInBackground(),onProgressUpdate(),onPostExecute()方法只能由系统调用,不能自己调用,我们只需要调用AsyncTask.execute()和publicProgress()方法就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: