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); } });