android - 增加 AsyncTask 堆栈大小?

标签 android

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]。

编辑 您可以使用您的自定义执行器,而不是使用 sThreadFactoryAsyncTaskTHREAD_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/

相关文章:

Android:检查多个项目ListView

android - 如何解决 Gfx 开发内存的使用问题

java - Android Studio 使用 , 而不是 .格式化字符串后

Android AsyncTask 奇怪的行为

java - 如何将quickbooks的java sdk集成到android应用程序中?

android - 检测类里面的电话 Activity

java - 如何从 arraylist 中获取随机项目而不在 android 中重复

android - Android 中强制关闭

android - 是日志 drom dart :developer are visible in release mode of flutter app?

android - Android 上弃用的类