3

如何结合 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.添加滑翔配置使用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 的情况下连接它

任何重复或链接都会有所帮助

4

3 回答 3

5

Re: 是否推荐在 Glide 中使用 okhttp3?

是的,这就是 OkHttp 集成的方式。

回复:为什么?我的错误在哪里?

这可能是必需的,因为内置的 GlideModule 可能会覆盖您拦截的客户端(在 GlideModule 执行之间没有定义的顺序)。考虑 wiki 中的以下内容:

当覆盖默认行为时,请确保您的自定义 GlideModule 已在清单中注册,并且默认的 GlideModule 被排除在外。排除可能意味着从清单中删除相应的元数据或使用 jar 依赖而不是 aar 依赖。--覆盖默认行为 - Glide Wiki

基于冲突的 GlideModules - Glide Wiki@aarokhttp3-integration依赖项中删除,或添加到清单:

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

还要确保你没有被缓存愚弄:.diskCacheStrategy(NONE).skipMemoryCache(true); 您可以在看到您期望的请求后立即删除它。


OkHttp3 更改了 APIclient.networkInterceptors()不再可写:

okhttp3.OkHttpClient client = new okhttp3.OkHttpClient.Builder()
            .addNetworkInterceptor(new com.facebook.stetho.okhttp3.StethoInterceptor())
            .build();
于 2016-04-15T12:44:06.183 回答
1

Re: 如何在不使用 okhttp3 的情况下连接它

默认(内置)网络集成使用HttpUrlFetcher由 创建的HttpUrlGlideUrlLoader,因此为了与 Stetho 集成,您需要将那些替换为拦截请求的网络集成。'

滑翔模块

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

确保StethoHttpUrlGlideUrlLoader返回修改后的类,而不是和中的内置buildgetResourceFetcher

自定义提取器

为简洁起见,此处仅包含结构差异,应该清楚这些行从上下文中的位置。完整代码可在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"));
        }
    }
}

例子

于 2016-04-15T17:35:06.227 回答
0

最后它
网络检查 根据Glide Wikis工作我更改了以下内容

<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未回答的问题

于 2016-04-15T14:50:03.230 回答