AysncTask的基本使用
public class MyAsyncTask extends AsyncTask<String, Integer, String> {
private ProgressBar mProgressBar;
public MyAsyncTask(ProgressBar progressBar) {
mProgressBar = progressBar;
}
/**
* 运行在子线程,执行耗时操作
*/
@Override
protected String doInBackground(String... params) {
try {
for (int i = 1; i <= 10; i++) {
Thread.sleep(200);
publishProgress(i * 10);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return params[0] + " = " + Thread.currentThread().getName();
}
/**
* 子线程(doInBackground)执行过程中,与主线程通信
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
mProgressBar.setProgress(values[0]);
}
/**
* 子线程(doInBackground)执行完毕
*/
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//mProgressBar.setVisibility(View.GONE);
Log.i("onPostExecute", s);
}
}
AsyncTask提交任务的方法
1、asyncTask.execute()
2、anyncTask.executeOnExecutor()
注意:一个AsyncTask实例只能execute一次,否则会报
java.lang.IllegalStateException: Cannot execute task: the task is already running
asyncTask.execute()
线程池最多五个线程,按先后顺序每次只运行一个,也就是说它是按提交的次序,每次只启动一个线程执行一个任务,完成之后再执行第二个任务,也就是相当于只有一个后台线程在执行所提交的任务asyncTask.executeOnExecutor(Executor exec,Params... params)
- 这个接口允许开发者提供自定义的线程池来运行和调度Thread。
- 系统预定义了两个线程池SERIAL_EXECUTOR和THREAD_POOL_EXECUTOR
其中SERIAL_EXECUTOR的效果和asyncTask.execute()一样。
THREAD_POOL_EXECUTOR是一个corePoolSize为5的线程池,也就是说最多只有5个线程同时运行,超过5个的就要等待。
自定义Executor
- Executors.newCachedThreadPool(),创建一个无大小限制的线程池,自动新增子线程
- Executors.newScheduledThreadPool(int corePoolSize),创建一个corePoolSize大小的线程池,允许corePoolSize个线程并发
- Executors.newSingleThreadScheduledExecutor(),创建一个只有一个线程的线程池,并按先后顺序每次只运行一个