当前位置: 首页 > wzjs >正文

黑龙江网站开发公司凡客优品官网

黑龙江网站开发公司,凡客优品官网,做企业网站哪里找,seo优化专员招聘最近有个需求,后端给出的图片地址并不是正常的 URL,而且需要一个接口去请求,但是返回的是 base64 数据流。这里不关心为啥要这么多,原因有很多,可能是系统的问题,也可能是能力问题。当然作为我们 Android 程…

最近有个需求,后端给出的图片地址并不是正常的 URL,而且需要一个接口去请求,但是返回的是 base64 数据流。这里不关心为啥要这么多,原因有很多,可能是系统的问题,也可能是能力问题。当然作为我们 Android 程序员,要紧的是如何解决这个问题。

首先我们拿到接口链接,我这次拿到的是这样的:

https://www.example.com/cdn/attach/{fileId}/base64

这里的{fileId} 是指图片的 id,那么正常的图片地址可以理解为:

https://www.example.com/cdn/attach/1000/base64
https://www.example.com/cdn/attach/1002/base64

熟悉 Glide 加载逻辑的人,应该很熟悉,这种方式可能需要我们自定义ModelLoader 来解决问题,们可以让 Glide 将 API 接口当作一种图片源来处理,就像处理普通的图片 URL 一样。

实现方案

我们可以自定义 Base64ApiModelLoader 来处理 base64 的请求数据:

public class Base64ApiModelLoader implements ModelLoader<String, InputStream> {private static final String BASE_URL = "https://your-api-base-url/";private static final String API_PATH = "cdn/attach/";private final OkHttpClient okHttpClient;public Base64ApiModelLoader() {this.okHttpClient = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).readTimeout(15, TimeUnit.SECONDS).build();}@Nullable@Overridepublic LoadData<InputStream> buildLoadData(@NonNull String fileId, int width, int height, @NonNull Options options) {// 创建缓存键,使用文件ID作为唯一标识Key key = new ObjectKey(API_PATH + fileId);// 返回加载数据,包含缓存键和数据获取器return new LoadData<>(key, new Base64ApiFetcher(fileId, okHttpClient));}@Overridepublic boolean handles(@NonNull String model) {// 判断是否是文件ID格式,这里简单判断不是URLreturn !model.startsWith("http") && !model.startsWith("data:");}// 工厂类,用于创建ModelLoaderpublic static class Factory implements ModelLoaderFactory<String, InputStream> {@NonNull@Overridepublic ModelLoader<String, InputStream> build(@NonNull MultiModelLoaderFactory multiFactory) {return new Base64ApiModelLoader();}@Overridepublic void teardown() {// 清理资源}}// 数据获取器,负责从API获取Base64数据并转换为InputStreamprivate static class Base64ApiFetcher implements DataFetcher<InputStream> {private final String fileId;private final OkHttpClient okHttpClient;private InputStream inputStream;private volatile boolean isCancelled;Base64ApiFetcher(String fileId, OkHttpClient okHttpClient) {this.fileId = fileId;this.okHttpClient = okHttpClient;}@Overridepublic void loadData(@NonNull Priority priority, @NonNull DataCallback<? super InputStream> callback) {if (isCancelled) {callback.onLoadFailed(new IOException("Cancelled"));return;}// 构建API请求URLString apiUrl = BASE_URL + API_PATH + fileId + "/base64";Request request = new Request.Builder().url(apiUrl).build();try {// 执行请求Response response = okHttpClient.newCall(request).execute();if (!response.isSuccessful()) {callback.onLoadFailed(new IOException("Failed to load Base64 data: " + response.code()));return;}// 解析响应体ResponseBody responseBody = response.body();if (responseBody == null) {callback.onLoadFailed(new IOException("Empty response"));return;}// 解析JSON响应String jsonString = responseBody.string();JSONObject jsonObject = new JSONObject(jsonString);// 检查响应码int code = jsonObject.optInt("code", -1);if (code != 200) {callback.onLoadFailed(new IOException("API error: " + jsonObject.optString("message", "Unknown error")));return;}// 获取Base64数据String base64Data = jsonObject.optString("data", "");if (base64Data.isEmpty()) {callback.onLoadFailed(new IOException("Empty Base64 data"));return;}// 处理可能存在的Data URI前缀if (base64Data.contains(",")) {base64Data = base64Data.split(",")[1];}// 解码Base64数据byte[] imageBytes = Base64.decode(base64Data, Base64.DEFAULT);// 创建输入流inputStream = new ByteArrayInputStream(imageBytes);// 回调成功callback.onDataReady(inputStream);} catch (IOException | JSONException | IllegalArgumentException e) {if (!isCancelled) {callback.onLoadFailed(e);}}}@Overridepublic void cleanup() {if (inputStream != null) {try {inputStream.close();} catch (IOException ignored) {// 忽略关闭错误}}}@Overridepublic void cancel() {isCancelled = true;}@NonNull@Overridepublic Class<InputStream> getDataClass() {return InputStream.class;}@NonNull@Overridepublic DataSource getDataSource() {return DataSource.REMOTE;}}
}

定义完成ModelLoader之后,我们可能就要注册ModelLoader了。


@GlideModule
public class MyAppGlideModule extends AppGlideModule {@Overridepublic void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {super.registerComponents(context, glide, registry);// 注册我们的自定义ModelLoader,用于处理Base64 API请求registry.append(String.class, InputStream.class, new Base64ApiModelLoader.Factory());}@Overridepublic boolean isManifestParsingEnabled() {return false;}
}

当然不能忘记需要有注解处理器

annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1'

处理完之后,我们就可以这么调用了:

		Glide.with(imageView.getContext()).load(fileId)  // +.placeholder(R.mipmap.default_image).error(R.mipmap.default_image).into(imageView);

我们之前 load 方法中一直调用的是 url, 这里就直接调用 fileId 即可。因为我们已经定义了

registry.append(String.class, InputStream.class, new Base64ApiModelLoader.Factory());

其他地方都不变,即可正常进行请求了。


文章转载自:

http://t8plsFFu.tsdjj.cn
http://FfK0P17f.tsdjj.cn
http://mqPAhmBf.tsdjj.cn
http://8OR9MS91.tsdjj.cn
http://C0j3VOpd.tsdjj.cn
http://EqYRXGTT.tsdjj.cn
http://kH3hIEJu.tsdjj.cn
http://BQmNU6m6.tsdjj.cn
http://CBznIlqA.tsdjj.cn
http://RAVQsYNo.tsdjj.cn
http://2Vfssd1a.tsdjj.cn
http://qCpO6pbn.tsdjj.cn
http://IbqPP1ax.tsdjj.cn
http://lOKzhRUM.tsdjj.cn
http://dWhwXGgy.tsdjj.cn
http://urkWoSw1.tsdjj.cn
http://E3nVAoDe.tsdjj.cn
http://5owoEdHK.tsdjj.cn
http://Zk6GrkPG.tsdjj.cn
http://QwbSFxZl.tsdjj.cn
http://ecPlXG0V.tsdjj.cn
http://B3n7rjom.tsdjj.cn
http://VHym2CZK.tsdjj.cn
http://WTRFew04.tsdjj.cn
http://ieoqBcj8.tsdjj.cn
http://hX2foCBi.tsdjj.cn
http://ka0SvH54.tsdjj.cn
http://xoeYsAyg.tsdjj.cn
http://FrBOXh9Z.tsdjj.cn
http://oOc829lk.tsdjj.cn
http://www.dtcms.com/wzjs/763223.html

相关文章:

  • 企业网站管理系统 开源wordpress防爆破
  • 化学网站定制签名在线生成器
  • 电商网站建设应用东莞seo网站制作报价
  • 购物商城网站建设公司网站导航的分类有哪些
  • 英铭广州网站建设个人免费域名空间建站
  • 长沙的网站建设公司哪家好怎么做网站信息
  • 网站流量查询最准的仿v2ex wordpress
  • 怎么去做一个网站网站换ip影响 百度
  • html静态网站模板南昌市建设工程质量监督站网站
  • 网站运营面试高端网站建设联系方式
  • 佛山专业建站公司融资网站建设重点
  • 专业seo站长工具成都网站搜索排名优化公司
  • 成都网站建设s1emens温州seo代理
  • 爱站网官网关键词查询商务网站开发设计结论
  • 网站开发公司小程序开发win8平板做网站服务器
  • 外贸网站推广服务怎么做自己的网站赚钱
  • 网站栏目规划在哪个国家做垂直网站好
  • 网站建设采取招标的方式做学分网站
  • 东莞塘厦网站建设wordpress优化技巧
  • html网站开发实验报告哪个网站开发是按月付费的
  • 网站做几个域名比较好网站外链建设实例
  • 开学第一课汉字做网站莱芜警方网站官网
  • 电子商务网站建设期中贺州市住房与城乡建设局网站
  • 图形化app开发工具天津seo网站设计
  • 精品网站建生活服务网站建设
  • 青州网站建设阿里云网站建设方案书一定要嘛
  • 惠州城乡规划建设局网站下载官方购物网站
  • 江苏外贸型网站制作网站怎么做缓存
  • vue网站开发教程HS酒店网站建设
  • 专业集团门户网站建设手机网站建设品牌