带自定义构造参数的AsyncTask代码如何迁移为ExecutorService实现
自定义任务类适配ExecutorService实现
你可以仿照原AsyncTask的封装逻辑,自定义实现Runnable接口的任务类,把Dao依赖、要操作的Customer参数都通过构造方法传入,和原来的实现逻辑几乎完全对齐:
private static class UpdateCustomerTask implements Runnable { private CustomerDao customerDao; private Customer targetCustomer; // 构造方法同时传入Dao和要更新的Customer对象,对应原AsyncTask构造传Dao + execute传参数的逻辑 public UpdateCustomerTask(CustomerDao customerDao, Customer targetCustomer) { this.customerDao = customerDao; this.targetCustomer = targetCustomer; } @Override public void run() { // 对应原AsyncTask的doInBackground逻辑,所有代码都在后台线程执行 try { customerDao.updateCustomer(targetCustomer); } catch (Exception e) { e.printStackTrace(); } } }
调用方式
初始化ExecutorService之后,构造任务实例提交即可:
// 线程池建议全局单例初始化,不要每次执行任务重复创建,避免资源浪费 int NUMBER_OF_THREADS = 4; ExecutorService executorService = Executors.newFixedThreadPool(NUMBER_OF_THREADS); // 构造任务实例,传入对应的Dao和要更新的Customer对象 UpdateCustomerTask updateTask = new UpdateCustomerTask(customerDao, needUpdateCustomer); // 提交到线程池执行 executorService.execute(updateTask);
扩展说明
- 如果你需要任务执行完后回到主线程更新UI,只需要在
run()方法末尾通过new Handler(Looper.getMainLooper()).post(() -> { /* 主线程操作代码 */ })切换线程即可,对应原AsyncTask的onPostExecute逻辑 - 如果需要拿到任务的返回值,可以把实现
Runnable改为实现Callable<T>,调用executorService.submit(callableTask)得到Future<T>对象即可获取返回结果
内容的提问来源于stack exchange,提问作者Emmanuel Njorodongo
相关产品推荐
相关产品推荐

