Android sdk 允许使用如下方式自定义非 ui 线程的堆栈大小:
ThreadGroup group = new ThreadGroup("threadGroup");
new Thread(group, runnableObject, "YourThreadName", 20000).start();
是否可以进行类似的调用以允许我使用具有增加堆栈大小的 AsyncTask
api?
最佳答案
AsyncTask
有一个ThreadFactory
的私有(private)静态对象(匿名内部类)来生成一个新的Thread
[1]:
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
}
};
如您所见,它的 newThread
方法返回一个 Thread(Runnable runnable, String threadName)
,没有任何 stackSize
参数。所以你无法改变它。但是,线程中的堆栈大小具有高度依赖于平台的解释。它甚至可能被完全忽略 [2]。
编辑 您可以使用您的自定义执行器,而不是使用 sThreadFactory
的 AsyncTask
的 THREAD_POOL_EXECUTOR
。例如:
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final int KEEP_ALIVE = 1;
private static final ThreadFactory yourFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
ThreadGroup group = new ThreadGroup("threadGroup");
return new Thread(group, r, "YourThreadName", 20000);
}
};
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(128);
public static final Executor YOUR_CUSTOM_THREAD_POOL_EXECUTOR
= new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, sPoolWorkQueue, yourFactory);
然后,您可以使用自定义执行器:
new AsyncTask().executeOnExecutor(YOUR_CUSTOM_THREAD_POOL_EXECUTOR, Params);
[1] https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java
[2] http://developer.android.com/reference/java/lang/Thread.html
关于android - 增加 AsyncTask 堆栈大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27277861/