滑行v4中的FifoPriorityThreadPoolExecutor

android_dev

我正在迁移一个应用程序以从v3滑行到v4.7.1,并注意到FifoPriorityThreadPoolExecutor类已被删除。我们使用它来限制Glide用于执行网络操作的线程数。

旧代码

public class GlideConfiguration implements GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        builder.setResizeService(new FifoPriorityThreadPoolExecutor(1));
    }

...
}

新密码

@GlideModule
public class MyAppGlideModule extends AppGlideModule {
    private static final String FIFO_SOURCE_EXECUTOR_NAME = "fifo-source";

    @Override
    public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
        builder.setSourceExecutor(newSourceExecutor(1, FIFO_SOURCE_EXECUTOR_NAME, GlideExecutor.UncaughtThrowableStrategy.DEFAULT));
    }
...

}

但是它仍然使用4个线程。我究竟做错了什么?

阿布希什

经过检查滑翔的源代码。仅当未向构建器提供源执行器时,Glide才会初始化其默认源执行器。

    Glide build(@NonNull Context context) {
        if (sourceExecutor == null) {
             sourceExecutor = GlideExecutor.newSourceExecutor();
        }

        if (diskCacheExecutor == null) {
            diskCacheExecutor = GlideExecutor.newDiskCacheExecutor();
        }

        if (animationExecutor == null) {
            animationExecutor = GlideExecutor.newAnimationExecutor();
        }
    ...
    }
    // Glide executor is simply a wrapper over ThreadPoolExecutor class.    
    public static GlideExecutor newSourceExecutor(int threadCount, String name, UncaughtThrowableStrategy uncaughtThrowableStrategy) {
        return new GlideExecutor(new ThreadPoolExecutor(threadCount /* corePoolSize */,threadCount /* maximumPoolSize */,0 /* keepAliveTime */,TimeUnit.MILLISECONDS,new PriorityBlockingQueue<Runnable>(),new DefaultThreadFactory(name, uncaughtThrowableStrategy, false)));
    }

由于您正在使用Stetho库检查线程以监视网络调用,因此不会显示有关线程的任何信息。这些请求很可能是由单线程发起的。

为了更好地了解应用程序中的线程使用情况,您应该使用 Android monitor -> DDMS -> Threads.

我使用DDMS线程工具进行了检查,发现只有一个运行上述代码片段的线程。 在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章