理想情况下,我希望能够使用AsyncTask.executeOnExecutor()
与一个 SERIAL_EXECUTOR
一起使用,但这只适用于API级别11或以上:
new AsyncTask().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, params);
为了支持Android API 11以下的版本,我实现了一个自定义类,该类封装了具有1个线程池大小的ExecutorService
。代码已在此处开源。
Executors.newFixedThreadPool(int nThreads)
创建一个线程池,该线程池重用一定数量的线程,并且使用共享无界队列。在任何时刻,最多只有nThreads
个线程正在处理任务。在我的情况下,nThreads
为1,这意味着任务可以排队,但是任何给定时间只会执行一个任务。
以下是代码:
public abstract class SerialExecutor {
private final ExecutorService mExecutorService;
public SerialExecutor() {
mExecutorService = Executors.newFixedThreadPool(1);
}
public void queue(Context context, TaskParams params) {
mExecutorService.submit(new SerialTask(context, params));
}
public void stop() {
mExecutorService.shutdown();
}
public abstract void execute(TaskParams params);
public static abstract class TaskParams { }
private class SerialTask implements Runnable {
private final Context mContext;
private final TaskParams mParams;
public SerialTask(Context context, TaskParams params) {
mContext = context;
mParams = params;
}
public void run() {
execute(mParams);
Activity a = (Activity) mContext;
a.runOnUiThread(new OnPostExecute());
}
}
private class OnPostExecute implements Runnable {
public void run() {
}
}
}
这可以被扩展并用作在Activity
中的串行任务执行器:
public class MyActivity extends Activity {
private MySerialExecutor mSerialExecutor;
@Override
public void onCreate(Bundle savedInstanceState) {
mSerialExecutor = new MySerialExecutor();
}
@Override
protected void onDestroy() {
if (mSerialExecutor != null) {
mSerialExecutor.stop();
}
super.onDestroy();
}
public void onTrigger(int param) {
mSerialExecutor.queue(this, new MySerialExecutor.MyParams(param));
}
private static class MySerialExecutor extends SerialExecutor {
public MySerialExecutor() {
super();
}
@Override
public void execute(TaskParams params) {
MyParams myParams = (MyParams) params;
}
public static class MyParams extends TaskParams {
public MyParams(int param) {
}
}
}
}