API 30中AsyncTask.THREAD_POOL_EXECUTOR已弃用,求替代方案(Espresso+RxJava场景)
替代AsyncTask.THREAD_POOL_EXECUTOR的方案
AsyncTask.THREAD_POOL_EXECUTOR被弃用后,推荐使用**Java并发包(java.util.concurrent)**中的线程池实现,结合Espresso IdlingResource和RxJava的场景,具体方案如下:
1. 自定义ThreadPoolExecutor
手动创建线程池,完全控制核心线程数、最大线程数、空闲超时等参数,适配测试场景:
// 定义线程池核心参数 private static final int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors(); private static final int MAX_POOL_SIZE = CORE_POOL_SIZE * 2; private static final long KEEP_ALIVE_TIME = 30L; private static final TimeUnit TIME_UNIT = TimeUnit.SECONDS; private static final BlockingQueue<Runnable> WORK_QUEUE = new LinkedBlockingQueue<>(); // 初始化自定义线程池 public static final ExecutorService CUSTOM_EXECUTOR = new ThreadPoolExecutor( CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TIME_UNIT, WORK_QUEUE, Executors.defaultThreadFactory() );
2. 使用Executors工具类创建预定义线程池
如果不需要自定义参数,可直接使用Executors提供的封装实现:
Executors.newCachedThreadPool():适合大量短耗时任务,线程自动回收Executors.newFixedThreadPool(nThreads):固定线程数,适配稳定任务量Executors.newSingleThreadExecutor():单线程串行执行任务
示例:
public static final ExecutorService FIXED_EXECUTOR = Executors.newFixedThreadPool(4);
3. 结合RxJava与Espresso IdlingResource适配
调整原方案的IdlingResource逻辑,监控新线程池的任务状态:
步骤1:实现自定义IdlingResource
public class ThreadPoolIdlingResource implements IdlingResource { private final ExecutorService executor; private ResourceCallback callback; public ThreadPoolIdlingResource(ExecutorService executor) { this.executor = executor; } @Override public String getName() { return ThreadPoolIdlingResource.class.getName(); } @Override public boolean isIdleNow() { if (executor instanceof ThreadPoolExecutor) { ThreadPoolExecutor threadPool = (ThreadPoolExecutor) executor; // 线程池空闲判断:活跃线程数为0 + 任务队列空 boolean isIdle = threadPool.getActiveCount() == 0 && threadPool.getQueue().isEmpty(); if (isIdle && callback != null) { callback.onTransitionToIdle(); } return isIdle; } return false; } @Override public void registerIdleTransitionCallback(ResourceCallback callback) { this.callback = callback; } }
步骤2:测试中注册IdlingResource
@Before public void setup() { ExecutorService customExecutor = YourClass.CUSTOM_EXECUTOR; ThreadPoolIdlingResource idlingResource = new ThreadPoolIdlingResource(customExecutor); Espresso.registerIdlingResources(idlingResource); } @After public void teardown() { Espresso.unregisterIdlingResources(idlingResource); }
步骤3:让RxJava绑定自定义线程池
在RxJava流中指定调度器使用自定义线程池:
Observable.just("test_data") .subscribeOn(Schedulers.from(YourClass.CUSTOM_EXECUTOR)) .observeOn(AndroidSchedulers.mainThread()) .subscribe(...);
这样Espresso就能通过IdlingResource跟踪RxJava在自定义线程池中的异步任务,确保测试等待任务完成后再执行断言。
内容的提问来源于stack exchange,提问作者wasi
相关产品推荐
相关产品推荐

