Проверка сети в Stetho с помощью Glide и okhttp3

как объединить Glide и Stetho для отладки системы загрузки изображений с помощью okhttp3

я сделал следующее

1.Добавлены зависимости

//stetho
compile 'com.facebook.stetho:stetho:1.3.1'
compile 'com.facebook.stetho:stetho-okhttp3:1.3.1'
//glide
compile 'com.github.bumptech.glide:glide:3.7.0'
// Glide's OkHttp3 Integration
compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'
//okhttp3
compile 'com.squareup.okhttp3:okhttp:3.2.0'

1.Добавлена ​​инициализация

public class MyApplication extends Application {

@Override
public void onCreate() {
    super.onCreate();

    Stetho.initialize(
            Stetho.newInitializerBuilder(this)
                    .enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
                    .enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this))
                    .build());
    }
}

3.добавьте конфиг glide для использования okhttp3

/**
 * Created by Arnaud Camus Copied by MOMANI on 2016/04/15.
 * http://arnaud-camus.fr/combining-glide-and-stetho-to-easily-debug-your-image-loading-system/
 */
public class StethoOkHttpGlideModule  implements GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) { }

    @Override
    public void registerComponents(Context context, Glide glide) {
        okhttp3.OkHttpClient client = new okhttp3.OkHttpClient();
        client.networkInterceptors().add(new com.facebook.stetho.okhttp3.StethoInterceptor());
        glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(client));
    }
}

4.добавлен тег метаданных GlideModule в AndroidManifest.xml

<application 
    android:name=".....">
    .....
     <meta-data android:name="android.alcode.com.material.utils.glide.StethoOkHttpGlideModule"
      android:value="GlideModule" />
</application>

5. Скользящая строка загрузки изображений

Glide.with(((ViewHolderSmall) holder).imageView.getContext())
                    .load(post.getImageUrl())
            //        .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                    .into(((ViewHolderSmall) holder).imageView);

когда я открываю инструмент разработчика Chrome, Resources Tab работает отлично, а network tab - нет!!!

Почему? где моя ошибка? и рекомендуется ли использовать okhttp3 с Glide? и как его подключить без использования okhttp3

любое дублирование или ссылки помогут


person Basheer AL-MOMANI    schedule 15.04.2016    source источник
comment
Совет: в вопросе нет вопроса, вы не описали, что не работает и что вы ожидаете.   -  person TWiStErRob    schedule 15.04.2016
comment
вопрос обновлен, спасибо @TWiStErRob   -  person Basheer AL-MOMANI    schedule 15.04.2016


Ответы (3)


Re: рекомендуется ли использовать okhttp3 с Glide?

Да, это способ интеграции OkHttp.

Ре: почему? где моя ошибка?

Вероятно, это необходимо, потому что встроенный GlideModule может перезаписывать ваш перехваченный клиент (нет определенного порядка между выполнением GlideModule). Рассмотрим следующее из вики:

При переопределении поведения по умолчанию убедитесь, что ваш пользовательский GlideModule зарегистрирован в манифесте, а модуль по умолчанию исключен. Исключение может означать удаление соответствующих метаданных из манифеста или использование jar-зависимости вместо aar-зависимости. -- Переопределение поведения по умолчанию — Glide Wiki

На основе конфликтующих модулей GlideModules — Glide Wiki: удалите @aar из зависимости okhttp3-integration, или добавить в манифест:

<meta-data android:name="com.bumptech.glide.integration.okhttp3.OkHttpGlideModule" tools:node=”remove” />

Также убедитесь, что вас не обманывает кеш: .diskCacheStrategy(NONE).skipMemoryCache(true); вы можете удалить это, как только увидите запросы, как вы ожидаете.


OkHttp3 изменил API client.networkInterceptors() больше не доступен для записи:

okhttp3.OkHttpClient client = new okhttp3.OkHttpClient.Builder()
            .addNetworkInterceptor(new com.facebook.stetho.okhttp3.StethoInterceptor())
            .build();
person TWiStErRob    schedule 15.04.2016
comment
Вот рабочий пример: github.com/TWiStErRob/glide-support/commit/ - person TWiStErRob; 15.04.2016
comment
когда я удалил @aar Гридл сказал Error:Failed to resolve: glide-parent:library:unspecified - person Basheer AL-MOMANI; 15.04.2016
comment
и в этой строке import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader; integration стало red (undefined), поэтому OkHttpUrlLoader также не определено - person Basheer AL-MOMANI; 15.04.2016
comment
@BasheerAL-MOMANI О, да, с выпуском 3.7.0/1.4.0 произошел сбой (см. github.com/bumptech/glide/issues/941) - person TWiStErRob; 15.04.2016

Re: как его подключить без использования okhttp3

По умолчанию (встроенная) сетевая интеграция использует HttpUrlFetcher, созданный HttpUrlGlideUrlLoader, поэтому для интеграции со Stetho вам необходимо заменить те, которые перехватывают запросы. '

Глайдмодуль

@Override public void registerComponents(Context context, Glide glide) {
    glide.register(GlideUrl.class, InputStream.class, new StethoHttpUrlGlideUrlLoader.Factory());
}

Убедитесь, что StethoHttpUrlGlideUrlLoader возвращает измененные классы, а не встроенные в build и getResourceFetcher.

Пользовательский сборщик

Здесь для краткости включен только структурный diff, должно быть понятно, куда идут эти строки из контекста. Полный код доступен на GitHub:

public class StethoHttpUrlFetcher implements DataFetcher<InputStream> {
    private final StethoURLConnectionManager stethoManager;
    public StethoHttpUrlFetcher(GlideUrl glideUrl) {
        ...
        this.stethoManager = new StethoURLConnectionManager("Glide");
    }

    private InputStream loadDataWithRedirects(...) {
        ...
        //urlConnection.setRequestProperty("Accept-Encoding", "gzip"); // don't request, it's wasteful for images
        ...
        stethoManager.preConnect(urlConnection, null);
        try {
            // Connect explicitly to avoid errors in decoders if connection fails.
            urlConnection.connect();
            stethoManager.postConnect();
        } catch (IOException ex) {
            stethoManager.httpExchangeFailed(ex);
            throw ex;
        }
        ...
    }

    private InputStream getStreamForSuccessfulRequest(HttpURLConnection urlConnection) throws IOException {
        try {
            InputStream responseStream = stethoManager.interpretResponseStream(urlConnection.getInputStream());
            if (TextUtils.isEmpty(urlConnection.getContentEncoding())) {
                ...
                stream = ContentLengthInputStream.obtain(responseStream, contentLength);
            } else {
                ...
                stream = responseStream;
            }
            return stream;
        } catch (IOException ex) {
            stethoManager.httpExchangeFailed(ex);
            throw ex;
        }
    }

    @Override public void cleanup() {
        ...
        if (isCancelled) { // otherwise it stays pending indefinitely because the stream is not read
            stethoManager.httpExchangeFailed(new IOException("Cancelled"));
        }
    }
}

пример

person TWiStErRob    schedule 15.04.2016
comment
Я очень ценю ваши усилия. Если вы будете давать это очень легко, то это поможет всем больше и больше. Заранее спасибо. - person Mohamed Ibrahim; 17.11.2016

Наконец это сработало
проверка сети в соответствии с Glide Wiki Я изменил следующее

<application 
    android:name=".....">
    .....
     <meta-data android:name="android.alcode.com.material.utils.glide.StethoOkHttpGlideModule"
      android:value="GlideModule" />

      <meta-data android:name="com.bumptech.glide.integration.okhttp3.OkHttpGlideModule" tools:node="remove" />

</application>

и в соответствии с @TWiStErRob's Answer я изменил следующее

public class StethoOkHttpGlideModule  implements GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) { }

    @Override
    public void registerComponents(Context context, Glide glide) {
        okhttp3.OkHttpClient client = new okhttp3.OkHttpClient.Builder()
            .addNetworkInterceptor(new com.facebook.stetho.okhttp3.StethoInterceptor())
            .build();
        glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(client));
    }
}

that's it но на некоторые вопросы о okhttp3 нет ответов

person Basheer AL-MOMANI    schedule 15.04.2016
comment
на некоторые вопросы об okhttp3 нет ответа, я обновил свой ответ, включив в него явные ответы на ваши вопросы. Также добавлен новый ответ для этого хорошо спрятанного :) [Его легко пропустить, так как остальная часть вопроса касается okhttp3, а это не так.] - person TWiStErRob; 15.04.2016
comment
Такие благодарности обычно награждаются нажатием стрелки вверх на элементе, который оказался полезным ;) - person TWiStErRob; 15.04.2016
comment
и неизвестное возможное :) функция может нуждаться в стрелке вверх - person Basheer AL-MOMANI; 15.04.2016