HarmonyOS 鸿蒙Next 使用ImageKnife,对于加密图片,如何在下载失败后重新获取新token,再次开启下载?
HarmonyOS 鸿蒙Next 使用ImageKnife,对于加密图片,如何在下载失败后重新获取新token,再次开启下载? 服务器返回的图片为加密字符串,然后再获取imagetoken,自己再拼接下载,如果获取imagetoken失败之后,ImageKnife无法重新再次请求刷新,怎么处理?
目前我通过设置自定义全局下载的方式,自己处理图片的下载逻辑
ImageKnife.getInstance().setCustomGetImage(custom)
@Concurrent
async function custom(context: Context, src: string | PixelMap | Resource, headers?: Record<string,Object>): Promise<ArrayBuffer | undefined> {
return new Promise((resolve,reject)=>{
if (typeof src == "string") {
IsEmptyImage(src as string).then(result=>{
const session = rcp.createSession();
let req = new rcp.Request(result,"GET");
session.fetch(req).then((response)=>{
if(response.statusCode == 200) {
let buffer = response.body
resolve(buffer)
} else {
reject("rcp code:"+response.statusCode)
}
}).catch((err:BusinessError)=>{
reject("error rcp src:"+src+",err:"+JSON.stringify(err))
})
})
}
})
}
在IsEmptyImage方法中,发现无法获取本地存储的登录token信息,我猜测是没有配置Sendable,导致数据无法在多线程中共享的原因,
//判断图片是否为null或空字符串,如果是,则使用占位图
export function IsEmptyImage(img?: string): Promise<string> {
return new Promise((resolve, reject) => {
if (img) {
if (typeof img == "string" && img.toLowerCase().startsWith("http")) {
resolve(img)
} else {
let imgToken = ImageTokenRequest.getInstance().token
if (imgToken){
let url = `${Configure.kBaseURL}api/getimage?imagesName=${img}&imageToken=${imgToken}`
resolve(url)
} else {
ImageTokenRequest.getInstance().requestImageToken().then(token => {
let url = `${Configure.kBaseURL}api/getimage?imagesName=${img}&imageToken=${token}`
resolve(url)
})
.catch((err: Error) => {
reject(err)
})
}
}
} else {
let err = new Error('图片路径为空')
reject(err)
}
})
}
requestImageToken是拿登录的token获取imagetoken的方法
更多关于HarmonyOS 鸿蒙Next 使用ImageKnife,对于加密图片,如何在下载失败后重新获取新token,再次开启下载?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
使用 async/await
来简化异步操作,确保它能够正确地返回一个有效的 token
export async function IsEmptyImage(img?: string): Promise<string> {
if (!img) {
throw new Error('图片路径为空');
}
if (typeof img === 'string' && img.toLowerCase().startsWith('http')) {
return img;
}
const imageTokenRequest = ImageTokenRequest.getInstance();
let imgToken = imageTokenRequest.token;
if (imgToken) {
const url = `${Configure.kBaseURL}api/getimage?imagesName=${img}&imageToken=${imgToken}`;
return url;
} else {
try {
const token = await imageTokenRequest.requestImageToken();
const url = `${Configure.kBaseURL}api/getimage?imagesName=${img}&imageToken=${token}`;
return url;
} catch (err) {
throw err;
}
}
}
更多关于HarmonyOS 鸿蒙Next 使用ImageKnife,对于加密图片,如何在下载失败后重新获取新token,再次开启下载?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next系统中,使用ImageKnife处理加密图片下载时,若下载失败需重新获取新token并再次尝试下载,可按照以下步骤操作:
-
监听下载事件:首先,需监听ImageKnife的下载事件,当检测到下载失败时,触发重新获取token的逻辑。
-
重新获取Token:在下载失败回调中,调用预先定义的重新获取token的函数。这个函数应负责向服务器请求新的token,通常涉及网络请求和身份验证。
-
更新Token并重启下载:获取到新token后,更新ImageKnife的token配置,并重新启动下载流程。确保新token已正确设置,以便下载请求能够使用新的认证信息。
-
错误处理:在重新获取token和重启下载的过程中,应添加适当的错误处理逻辑,以应对可能发生的网络错误、token无效等异常情况。
-
重试次数限制:为避免无限重试,可以设置重试次数限制。当达到限制时,应停止重试并给出用户提示。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html 。