FifoPriorityThreadPoolExecutor в glide v4 - PullRequest
0 голосов
/ 29 июня 2018

Я перемещаю приложение для перехода с v4.7.1 на v3.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 потока. Что я делаю не так?

1 Ответ

0 голосов
/ 09 июля 2018

После проверки исходного кода глиссады. 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» и нашел только один поток, работающий с упомянутым фрагментом кода. enter image description here

...