本文主要是介绍AsyncTask 异步任务解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1:构建AsyncTask 子类的回调方法:A:doInBackground: 必须重写,所有的耗时操作都在这个里面进行;
B: onPreExecute: 用户操作数据前的调用; 例如:显示一个进度条 等 ;
C: onPostExecute: 当doInBackground 执行完成后;会自动把数据传给onPostExecute方法;也就是说:这个方法是处理返回的数据的方法;(在这个方法中对 获取的数据进行UI上的处理。);
D: onProgressUpdate: 显示的网络获取数据的进度;(Progress);
API 中说明:
AsyncTask<Params,Progress,Result>
对AsyncTask中的参数进行说明: 里面有三个参数;
AsyncTask<Params,Progress,Result> 对AsyncTask中的参数进行说明: 里面有三个参数;
Params:
是通过 exexute 所带入的参数;可以是一个str字符串;也可以是一个str[]字符集合,也可以是一个Url 或者Url[] 集合;具体要看情况;案例中用的是一个str字符串(urls)的形式;
Progress:
是一個获取网络进度的 显示;例如 进度条的值(整形的);(不使用的时候;可以不返回:也就是Void);这里使用了进度条的值:整形的;Integer
Result :
就是获取数据后 ; 返回的结果了;本案例是获取一个图片;所以结果返回图片;当然也可以返回流什么的;在显示的时候做处理生成图片也是可行的;这里是直接处理后返回图片了;
图例:
部分代码:网络数据获取;
代码里面有详细的注释说明:
下面是一个获取网络图片 并且显示进度条的例子(测试进度条应该放的位置。)
public class MyAsyncTask_Image extends AsyncTask<String, Void, Bitmap> {
public static String TAG = "MyAsyncTask:---";
// LS:所有的耗时的操作都在这个里面进行; 这个重写是必须要有的
@Override
protected Bitmap doInBackground(String... arg0) {
Log.e(TAG, "doInBackground---");
String geturl = arg0[0];//LS:这里的 arg0 可以是一个str字符串;也可以是一个数组集合;具体要看 调用execute中的参数;在获取图片这个例子中;调用这个函数传递的是一个值:Urls那么这里要取arg0[0]即可;
//所以arg0 其實就是一個數組;
publishProgress();// LS:这里调用进度条的进度;和 onProgressUpdate 方法对应;
return null;
}
// LS:这个是在操作数据前进行的逻辑处理;如在请求数据 前;显示一个 进度条什么的;
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
Log.e(TAG, "onPreExecute---");
}
// LS:用来更新网络获取数据的进度
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
Log.e(TAG, "onProgressUpdate---" + values);
}
// LS:这个是 用来处理 获取数据后;返回的数据的 处理;
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
}
部分代码:进度条显示加载;
在重写函数:doInBackground 中 对进度条的进度加载
// ---------------模拟测试进度条的 方法;(开发中:这个进度条应该是在 加载网络数据的时候进行实时进度显示的)
for (int i = 0; i < 100; i++) {
if(mypro.isCancelled()){//LS:这里对应的就是 onPause中的 cancel 方法的 执行者了;
break;//:退出当前循环
}
publishProgress(i);// LS:这个publishProgress
// 方法中的参数就是Integer的参数;也就是AsyncTask
// 中那三个参数中的第二个Integer;这个测试同样可以是一个数组 等;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// LS:休眠一下;便于观察 进度条的显示
}
// ++++++++++++++++模拟测试进度条的 方法;以上就是简化版的进度的测试;下面是一个图片获取的案例的演示。
注意: 执行 异步任务 必须放在主线程中执行;
具体不说了 ;夜深了 晚安!
传送门---
这篇关于AsyncTask 异步任务解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!