OkHttpStreamFetcher.java 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package com.guiying.common.glide;
  2. import com.bumptech.glide.Priority;
  3. import com.bumptech.glide.load.data.DataFetcher;
  4. import com.bumptech.glide.load.model.GlideUrl;
  5. import com.bumptech.glide.util.ContentLengthInputStream;
  6. import com.guiying.common.utils.CloseUtils;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.util.Map;
  10. import okhttp3.OkHttpClient;
  11. import okhttp3.Request;
  12. import okhttp3.Response;
  13. import okhttp3.ResponseBody;
  14. /**
  15. * Fetches an {@link InputStream} using the okhttp library.
  16. */
  17. public class OkHttpStreamFetcher implements DataFetcher<InputStream> {
  18. private final OkHttpClient client;
  19. private final GlideUrl url;
  20. private InputStream stream;
  21. private ResponseBody responseBody;
  22. public OkHttpStreamFetcher(OkHttpClient client, GlideUrl url) {
  23. this.client = client;
  24. this.url = url;
  25. }
  26. @Override
  27. public InputStream loadData(Priority priority) throws Exception {
  28. Request.Builder requestBuilder = new Request.Builder()
  29. .url(url.toStringUrl());
  30. for (Map.Entry<String, String> headerEntry : url.getHeaders().entrySet()) {
  31. String key = headerEntry.getKey();
  32. requestBuilder.addHeader(key, headerEntry.getValue());
  33. }
  34. Request request = requestBuilder.build();
  35. Response response = client.newCall(request).execute();
  36. responseBody = response.body();
  37. if (!response.isSuccessful()) {
  38. throw new IOException("Request failed with code: " + response.code());
  39. }
  40. long contentLength = responseBody.contentLength();
  41. stream = ContentLengthInputStream.obtain(responseBody.byteStream(), contentLength);
  42. return stream;
  43. }
  44. @Override
  45. public void cleanup() {
  46. if (stream != null) {
  47. try {
  48. stream.close();
  49. } catch (IOException e) {
  50. // Ignored
  51. }
  52. }
  53. if (responseBody != null) {
  54. CloseUtils.closeIO(responseBody);
  55. }
  56. }
  57. @Override
  58. public String getId() {
  59. return url.getCacheKey();
  60. }
  61. @Override
  62. public void cancel() {
  63. }
  64. }