glide v4 中的 FifoPriorityThreadPoolExecutor
FifoPriorityThreadPoolExecutor in glide v4
我正在将一个应用程序从 v3 迁移到 glide v4.7.1,并注意到 FifoPriorityThreadPoolExecutor class 已被删除。我们用它来限制 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 才会初始化它的默认源代码执行器。
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 线程工具进行了检查,发现只有一个线程 运行 提到了代码片段。
我正在将一个应用程序从 v3 迁移到 glide v4.7.1,并注意到 FifoPriorityThreadPoolExecutor class 已被删除。我们用它来限制 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 才会初始化它的默认源代码执行器。
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 线程工具进行了检查,发现只有一个线程 运行 提到了代码片段。