AsyncTask异步任务类使用
来源:互联网 发布:软件管理系统php 编辑:程序博客网 时间:2024/05/16 00:31
优点:封装了handler+thread+线程池
特点:1、android中已经写好了的多线程
2、处理UI Thread和worker
代码示例:
KateAsycTask task = new KateAsycTask();task.execute(url,1+""); class KateAsycTask extends AsyncTask<String, Integer, Bitmap>{private InputStream inputStream;private final String SD_CARD_PATH = Environment.getExternalStorageDirectory().getAbsolutePath().toString();private int maxLength;private FileOutputStream outputStream;/*** 运行在主线程:在异步任务执行之前调用()* 主要做一些初始化*/@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();}/*** 在子线程中执行:执行下载任务*/@Overrideprotected Bitmap doInBackground(String... params) {Bitmap bitmap =null;String imageUrl = params[0];//String s = params[1];try {//1,创建urlURL url = new URL(imageUrl);//2,打开链接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//3,设置请求方式conn.setRequestMethod("GET");//4,设置超时时间conn.setConnectTimeout(5000);if(conn.getResponseCode() == 200){maxLength = conn.getContentLength();//设置进度条的最大值pb.setMax(maxLength);inputStream = conn.getInputStream();//为主线程中的imageView设置图片----//bitmap = BitmapFactory.decodeStream(inputStream);String fileName = imageUrl.substring(imageUrl.lastIndexOf("/")+1);outputStream = new FileOutputStream(SD_CARD_PATH+"/"+ fileName);int len = 0;byte[] buffer = new byte[1024];while((len=inputStream.read(buffer))!=-1){outputStream.write(buffer, 0, len);//更新进度条---不能在这里更新:onProgressUpdate//onProgressUpdate(len);publishProgress(len);//触发调用onProgressUpdate}bitmap = BitmapFactory.decodeFile(SD_CARD_PATH+"/"+fileName);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {if(outputStream!=null){outputStream.close();}if(inputStream!=null){inputStream.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return bitmap;}/*** 在主线程中执行:接收异步任务下载的进度 更新UI线程的控件*/@Overrideprotected void onProgressUpdate(Integer... values) {pb.setProgress(pb.getProgress()+values[0]);String text = "下载进度:"+100 * pb.getProgress() / maxLength+ "%" ;progressText.setText(text);super.onProgressUpdate(values);}/*** 在主线程中执行:接收异步线程返回的结果*/@Overrideprotected void onPostExecute(Bitmap result) {super.onPostExecute(result);iv_Image.setImageBitmap(result);}/*** 取消异步任务(终止)*/@Overrideprotected void onCancelled() {// TODO Auto-generated method stubsuper.onCancelled();}}
asynctask执行异步任务的源码分析
1, public AsyncTask()
初始化了 mWorker(runnable) mFuture(task)
2, task.execute(Params... params)
executeOnExecutor(sDefaultExecutor, params);
onPreExecute();
exec.execute(mFuture);
sDefaultExecutor.execute(mFuture);
SerialExecutor.execute(mFuture);
mFuture(mWorker).run();
callback.call();
mWorker.call();
doInBackground(mParams)
postResult
通过Handler发送消息:MESSAGE_POST_RESULT
3,InternalHandler extends Handler
MESSAGE_POST_RESULT:
onPostExecute(result);
MESSAGE_POST_PROGRESS
onProgressUpdate(result.mData);
4, publishProgress(Progress... values)
sHandler.obtainMessage(MESSAGE_POST_PROGRESS,
new AsyncTaskResult<Progress>(this, values)).sendToTarget();
5, 通过线程工厂来 创建线程 :
ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
}
总结:在AsycTask中存在2个线程池
1,SERIAL_EXECUTOR保存了一个装有异步任务的队列
2,THREAD_POOL_EXECUTOR执行异步任务的线程池
0 0
- AsyncTask异步任务类使用
- 异步任务AsyncTask使用
- 异步任务AsyncTask使用
- AsyncTask异步任务类的使用
- AsyncTask异步任务类
- AsyncTask异步任务使用解析
- 异步任务AsyncTask的使用
- 使用AsyncTask运行异步任务
- 使用AsyncTask运行异步任务
- AsyncTask异步任务使用详解
- AsyncTask异步任务的使用
- 异步任务AsyncTask使用解析
- Android异步任务AsyncTask使用
- 异步任务AsyncTask使用解析
- Android 异步任务AsyncTask类的简单使用
- [Android]异步任务AsyncTask使用解析
- [Android]异步任务AsyncTask使用解析
- [Android]异步任务AsyncTask使用解析
- Tensorflow: recurrent neural network char-level 0
- JZ2440 启动NFS网络文件系统_初试led驱动
- iTextSharp 绘制字体中特殊符号到PDF
- CUDA编程(一):背景与安装
- 图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()
- AsyncTask异步任务类使用
- TableViewController中的搜索框和mj刷新配合使用
- picasso-强大的Android图片下载缓存库
- 善用iOS App中Web View控件的好处
- Android Studio 中api>9 之后无法找到 org.apache.http 包的问题
- android设计模式之装饰模式(一)
- 安卓蓝牙BLE设备开发
- 理解jquery的$.extend()、$.fn和$.fn.extend()
- HttpClient抓包返回值乱码