android开发步步为营之80:android多线程总结
来源:互联网 发布:linux退出vi编辑命令 编辑:程序博客网 时间:2024/06/10 20:19
android常用的多线程使用方法主要有这几种:一、使用AsyncTask 二、使用Thread或者HandlerThread 三、使用ExecutorService。下面分别简单介绍一下。
方法一、使用AsyncTask 内部实现其实是使用ExecutorService,有cpu个数*2+1个线程的限制
public class MyAsyncTask extends AsyncTask<String, Integer, String> { @Override protected String doInBackground(String... params) { //耗时任务 return null; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } }
调用:
MyAsyncTask myAsyncTask = new MyAsyncTask(); myAsyncTask.execute("url");</span>
方法二、使用Thread或者HandlerThread 适用单个任务
<span style="font-size:14px;"> class MyThread extends Thread { @Override public void run() { super.run(); //TODO 耗时任务 } }调用:
MyThread myThread = new MyThread(); myThread.start(); //或者 HandlerThread ht = new HandlerThread("handler thread"); ht.start(); Handler handler = new Handler(ht.getLooper()); handler.post(new Runnable() {//这里run()方法其实还是在等ht.start()调用 public void run() { //TODO 耗时任务 } });
方法三:使用ExecutorService创建线程池 适合多次调用
/** * 下载Image的线程池 */ private ExecutorService mImageThreadPool = null; /** * 获取线程池的方法,因为涉及到并发的问题,我们加上同步锁 * * @return */ public ExecutorService getExecutorService() { if (mImageThreadPool == null) { synchronized (ExecutorService.class) { if (mImageThreadPool == null) {// mImageThreadPool = Executors.newFixedThreadPool(2);//分配两个线程 mImageThreadPool = Executors.newCachedThreadPool();//动态分配,不限制个数 } } } return mImageThreadPool; }
调用:
Handler handler=new Handler();//这个handler是属于主线程 public interface Callback { void getBitmap(Bitmap bitmap); } public void downloadImg(final String url, final Callback callback) { getExecutorService().submit(new Runnable() { @Override public void run() { Log.i(tag, "Current Thread:" + Thread.currentThread().getName()); Bitmap bitmap = getBitmapFormUrl(url); handler.post(new Runnable() {//确保运行到主线程去 @Override public void run() { callback.getBitmap(bitmap); } }); } }); } //在recyclerView或者gridview,listview中的adapter调用 downloadImg(mListPersonalizedStickers.get(position), new Callback() { @Override public void getBitmap(Bitmap bitmap) { holder.mImageView.setImageBitmap(drawable); } });
1 0
- android开发步步为营之80:android多线程总结
- android开发步步为营之70:android接入Google Analytics总结
- android开发步步为营之68:Facebook原生广告接入总结
- android开发步步为营之73:Android开发常见问题技术点总结之二
- android开发步步为营之9:反编译apk
- android开发步步为营之14:App Widgets
- android开发步步为营之20:网络设置
- android开发步步为营之28:自定义Menu
- android开发步步为营之56:Android开发常见问题技术点总结之一
- android开发步步为营之59:android定时任务之ScheduledThreadPoolExecutor
- android开发步步为营之77:android数据库ORM之greenDAO
- android开发步步为营之55:google广告平台admob接入总结
- Android开发步步为营之55:google广告平台admob接入总结
- android开发步步为营之66:android图片选取
- android开发步步为营之76:android导出anr日志
- android开发步步为营之82:android多语言国际化
- android开发步步为营之110:android反编译apk
- android开发步步为营之2:开发自定义进度条对话框
- 黑马程序员——OC语言基础---类和对象
- 字符串全排列和组合问题
- 单链表
- 逆波兰表达式
- scala中用implicit实现依赖注入
- android开发步步为营之80:android多线程总结
- 类型进阶
- js函数对象的总结
- (2)Java开发和运行环境的搭建详解
- [kuangbin带你飞]数论基础的简单题解
- 第4周项目4- 建设双链表算法库
- 文件代码模板的使用
- W3school学习笔记之HTML5
- block 传值 遇到的出错点:Thread 1:EXC_BAD_ACCESS(code=1,address=0x10)