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);

クロム開発者ツールを開くとResources Tab完全に機能しますが、network tab機能しません!!!

なぜ?私の間違いはどこですか?okhttp3グライドと併用することをお勧めしますか? そしてokhttp3を使わずに接続する方法

重複やリンクは役に立ちます

4

3 に答える 3

5

Re: Glide で okhttp3 を使用することをお勧めしますか?

はい、これが OkHttp 統合への道です。

Re: なんで?私の間違いはどこですか?

組み込みの GlideModule が傍受されたクライアントを上書きする可能性があるため、これが必要になる可能性があります (GlideModule の実行間に定義された順序はありません)。wiki から次のことを考慮してください。

デフォルトの動作をオーバーライドする場合は、カスタム GlideModule がマニフェストに登録され、デフォルトの GlideModule が除外されていることを確認してください。除外とは、対応するメタデータをマニフェストから削除するか、aar の代わりに jar 依存関係を使用することを意味する場合があります。--デフォルト動作のオーバーライド - 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 が 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および の組み込みクラスではなく、変更されたクラスを返すようにしbuildてくださいgetResourceFetcher

カスタムフェッチャー

ここでは、簡潔にするために構造的な差分のみを示しています。これらの行が文脈からどこに行くのかは明らかです。完全なコードは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 に答える