HarmonyOS taskpool执行@Concurrent修饰的方法在访问主线程中的单例变量时,变量是空的
taskpool执行@Concurrent修饰的方法在访问主线程中的单例变量时,变量是空的,传selfHttpManage过去又报错:is not callable,但是为什么getContext()传过去可以用,代码如下:
SelfHttpManage.ets
export class SelfHttpManage {
private httpUtil: HttpUtil | null = null;
getSelfHttp(): HttpUtil {
if (this.httpUtil) {
return this.httpUtil;
}
return new HttpUtil(CommonUrlManager.getInstance().getSelfInterface());
}
}
const selfHttpManage = new SelfHttpManage();
export default selfHttpManage
public static async uploadFile(fileUri: string, categoryId: VerifyUploadCategoryId,
basePageConfig?: BasePageConfig): Promise<FileUploadResModel> {
const params: VerifyUploadParam = {
userId: UserInfoManager.getUserId(),
categoryId: categoryId,
streamZip: '',
fileName: '', // 该值会在 concurrentUploadFile 方法中自动设置
}
const uploadParam : UploadFileConfig = {
fileUri: fileUri, path: SelfApi.verifyUpload, params: params, basePageConfig
}
const task = new taskpool.Task(concurrentUploadFile, uploadParam, selfHttpManage, getContext());
const result = await taskpool.execute(task);
return result as FileUploadResModel;
}
@Concurrent
export async function concurrentUploadFile(uploadParam: UploadFileConfig, httpManage: SelfHttpManage, context: Context): Promise<FileUploadResModel> {
const compressedImageInfo = await ImageCompressionUtil.compressImg(uploadParam.fileUri, context);
const formData = new FormData();
formData.append('image', 'internal://cache/' + compressedImageInfo.fileName, { filename: "image.jpg", type: 'multipart/form-data' })
uploadParam.params.fileName = compressedImageInfo.fileName;
try {
const result = await httpManage.getSelfHttp()
.uploadFile<FileUploadResModel>({
url: uploadParam.path,
context: CommonUtil.getContext(),
params: uploadParam.params,
data: formData,
});
try {
fileIo.unlinkSync(compressedImageInfo.imageUri);
ToastUtil.showDebugToast(`文件上传结束,删除临时文件成功:${compressedImageInfo.imageUri}`);
} catch (e) {
ToastUtil.showDebugToast(`文件上传结束,删除临时文件失败:${compressedImageInfo.imageUri}, ${JSON.stringify(e)}`);
}
return result;
} catch (e) {
try {
fileIo.unlinkSync(compressedImageInfo.imageUri);
ToastUtil.showDebugToast(`文件上传结束,删除临时文件成功:${compressedImageInfo.imageUri}`);
} catch (e) {
ToastUtil.showDebugToast(`文件上传结束,删除临时文件失败:${compressedImageInfo.imageUri}, ${JSON.stringify(e)}`);
}
throw e as Error;
}
}
export interface UploadFileConfig {
fileUri: string,
path: string,
params: VerifyUploadParam,
basePageConfig?: BasePageConfig,
}
await httpManage.getSelfHttp()这里会报错:is not callabl。
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
HarmonyOS taskPool执行的task内如何回调主线程的方法
532浏览 • 1回复 待解决
var能否修饰ArkTS中的变量?
490浏览 • 1回复 待解决
TaskPool在任务执行过程中如何跟主线程进行通信?如何操作同一块内存变量
2070浏览 • 1回复 待解决
LocalStorageLink修饰的变量会自动保存
953浏览 • 1回复 待解决
ArkTS的单例模式下判空逻辑会执行两次是什么回事
585浏览 • 1回复 待解决
事件系统eventHub,在组件中使用 eventHub.on 订阅的方法,不能访问组件的变量
1045浏览 • 1回复 待解决
类似CallStateObserver中的回调,是在app主线程,还新的线程中?
5206浏览 • 1回复 待解决
单例在hsp中存在多个的情况
269浏览 • 1回复 待解决
Har包内的单例对象在被外部module访问时,拿到是新的对象吗? Har包是内存隔离的吗?
2021浏览 • 1回复 待解决
Worker的宿主线程必须是主线程吗?
407浏览 • 1回复 待解决
zip包的解压是在主线程还是IO线程
1646浏览 • 1回复 待解决
ArkTS中声明变量时public的作用
2360浏览 • 1回复 待解决
HarmonyOS 如何在taskPool中的@Concurrent方法中获取应用Context上下文?
163浏览 • 1回复 待解决
使用@LocalStorageProp修饰的变量,当子组件中的变量值变了,@Entry页面中的值没有发生变化。
370浏览 • 1回复 待解决
HarmonyOS @State修饰的class变量没有嵌套的值无法监听
251浏览 • 1回复 待解决
HarmonyOS Debug期间在涉及到单例的执行链条中总会出现类似日志如下
386浏览 • 1回复 待解决
请问如何判断当前执行的方法运行的子线程还是主线程,以及如何打印线程ID
234浏览 • 1回复 待解决
HarmonyOS libuv实现的timer,在主线程执行没有回调,在子线程可以正常使用
399浏览 • 1回复 待解决
HarmonyOS在异步线程往主线程抛任务无法被执行
369浏览 • 1回复 待解决
@State 修饰的变量值改变,界面不刷新
1500浏览 • 1回复 待解决
TaskPool子线程和主线程如何通信
2318浏览 • 1回复 待解决
用taskpool开辟一个线程操作文件,解析文件,然后有多个单例对象。有好方法吗?
151浏览 • 1回复 待解决
#鸿蒙通关秘籍#在ExtensionAbility中检测系统环境变量变更的方法
55浏览 • 1回复 待解决
TaskPool和Worker中任务的执行调度方式是怎样的?
448浏览 • 1回复 待解决
HarmonyOS Entry和Hsp中创建的单例失效
423浏览 • 1回复 待解决
目前的话@Concurrent函数中暂不支持从外部拿对象进行操作。因为线程模型中,TaskPool所在的线程与主线程并不共享一个ArkTS引擎实例,详细线程模型文档可参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/thread-model-stage-V5
所以在执行MyStroage.getInstance()时,主线程和TaskPool线程不会拿到同一个MyStroage对象。从TaskPool的应用场景来看,也不推荐在TaskPool中使用和操作全局单例对象。