HarmonyOS 鸿蒙Next关于选择图片上传后app卡死问题
HarmonyOS 鸿蒙Next关于选择图片上传后app卡死问题
Device info:OpenHarmony 3.2
Build info:OpenHarmony 3.2.9.1
Module name:com.example.dangquntong
Version:1.0.0
Pid:6039
Uid:20040004
Reason:Signal:SIGABRT(SI_QUEUE)@0x0131c94400001797 from:6039:20040004
LastFatalMessage:
Thread name:com.example.dan
#00 pc 000000000009fcbf /vendor/aosp/system/lib64/libc.so(abort+191) (2de37b8aa6e96dd64a6cfa51bd78ae6e)
#01 pc 000000000010ff17 /system/lib64/libc++.so (b0558bc452cf6af82d54d8a4a5753b5d9a038edd)
#02 pc 00000000000ecb36 /system/lib64/libc++.so (b0558bc452cf6af82d54d8a4a5753b5d9a038edd)
#03 pc 000000000010e471 /system/lib64/libc++.so (b0558bc452cf6af82d54d8a4a5753b5d9a038edd)
#04 pc 0000000000113675 /system/lib64/libc++.so (b0558bc452cf6af82d54d8a4a5753b5d9a038edd)
#05 pc 00000000001135cc /system/lib64/libc++.so(__cxa_throw+172) (b0558bc452cf6af82d54d8a4a5753b5d9a038edd)
#06 pc 000000000009470b /system/lib64/libc++.so(std::__h::stol(std::__h::basic_string<char, std::__h::char_traits<char>, std::__h::allocator<char>> const&, unsigned long*, int)+363) (b0558bc452cf6af82d54d8a4a5753b5d9a038edd)
#07 pc 000000000000d42b /system/lib64/libupload_lib.z.so (db411fe02e0de4c4a073f1029d88926b)
#08 pc 000000000000c847 /system/lib64/libupload_lib.z.so (db411fe02e0de4c4a073f1029d88926b)
#09 pc 0000000000061683 /system/lib64/libcurl_shared.z.so (e44ad4c1542f8e4681da2dd58508cde2)
#10 pc 0000000000047283 /system/lib64/libcurl_shared.z.so (e44ad4c1542f8e4681da2dd58508cde2)
#11 pc 0000000000072e56 /system/lib64/libcurl_shared.z.so (e44ad4c1542f8e4681da2dd58508cde2)
#12 pc 000000000005908f /system/lib64/libcurl_shared.z.so (e44ad4c1542f8e4681da2dd58508cde2)
#13 pc 000000000005834d /system/lib64/libcurl_shared.z.so(curl_multi_perform+173) (e44ad4c1542f8e4681da2dd58508cde2)
#14 pc 000000000000c167 /system/lib64/libupload_lib.z.so (db411fe02e0de4c4a073f1029d88926b)
#15 pc 000000000000bd6e /system/lib64/libupload_lib.z.so (db411fe02e0de4c4a073f1029d88926b)
#16 pc 0000000000012aa2 /system/lib64/libupload_lib.z.so (db411fe02e0de4c4a073f1029d88926b)
#17 pc 000000000001230c /system/lib64/libupload_lib.z.so (db411fe02e0de4c4a073f1029d88926b)
#18 pc 000000000001207b /system/lib64/libupload_lib.z.so (db411fe02e0de4c4a073f1029d88926b)
#19 pc 00000000000152b8 /system/lib64/libupload_lib.z.so (db411fe02e0de4c4a073f1029d88926b)
#20 pc 0000000000108e1a /vendor/aosp/system/lib64/libc.so(__pthread_start(void*)+58) (2de37b8aa6e96dd64a6cfa51bd78ae6e)
#21 pc 00000000000a1477 /vendor/aosp/system/lib64/libc.so(__start_thread+55) (2de37b8aa6e96dd64a6cfa51bd78ae6e)
------------------------------------------------------下面是代码---------------------------------
```perl
import picker from '[@ohos](/user/ohos).file.picker';
import common from '[@ohos](/user/ohos).app.ability.common';
import fs from '[@ohos](/user/ohos).file.fs';
import request from '[@ohos](/user/ohos).request';
import * as commonConst from '../common/constants/CommonConstants';
import { GlobalContext } from '../common/utils/GlobalContext';
import PreferencesHandler from '../model/database/PreferencesHandler';
// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let cacheDir = context.cacheDir;
// 上传任务配置项
let uploadConfig = {
url: 'http://192.168.1.8:8224/system/upload/upFile',
header: {"Content-Type":"multipart/form-data","Authorization":"" },
method: 'POST',
files: [
{ filename: 'test.jpg', name: 'file', uri: 'internal://cache/test.jpg', type: 'jpg' }
],
data: [
{ name: 'test', value: '111' }
]
}
[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
[@State](/user/State) message: string = ''
[@State](/user/State) imgSrc: string = ''
aboutToAppear(){
let preference = GlobalContext.getContext().getObject('preference') as PreferencesHandler;
preference.get("token").then((token:string)=>{
uploadConfig.header.Authorization = 'Bearer '+token
console.log('uploadConfig:',JSON.stringify(uploadConfig))
})
}
async selectImage() {
try {
let PhotoSelectOptions = new picker.PhotoSelectOptions();
PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
PhotoSelectOptions.maxSelectNumber = 2;
let photoPicker = new picker.PhotoViewPicker();
photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult) => {
console.info('xx PhotoViewPicker.select successfully, PhotoSelectResult uri: '+ JSON.stringify(PhotoSelectResult));
// 从图库选择图片后,返回图片uri
let uri = PhotoSelectResult.photoUris[0];
console.info('xx uri:'+uri)
this.imgSrc = uri
// 读取上面返回uri
let file = fs.openSync(uri, fs.OpenMode.CREATE);
// 复制文件到缓存目录下
fs.copyFileSync(file.fd, cacheDir + '/test.jpg')
// 上传文件到服务器上
this.uploadImage()
}).catch((err) => {
console.error('xx PhotoViewPicker.select failed with err: '+ err);
});
} catch (err) {
console.error('xx PhotoViewPicker failed with err: '+ err);
}
}
uploadImage() {
// 将本地应用文件上传至网络服务器
try {
request.uploadFile(context, uploadConfig)
.then((uploadTask) => {
uploadTask.on('complete', (taskStates) => {
for (let i = 0; i < taskStates.length; i++) {
console.info(`xx upload complete taskState: ${JSON.stringify(taskStates[i])}`);
this.message = JSON.stringify(taskStates[i])
}
});
})
.catch((err) => {
console.error(`xx Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
this.message = err.message
})
} catch (err) {
console.error(`xx Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
this.message = err.message
}
}
build() {
Column({space: 30}) {
Button('打开图库')
.width('80%').height('40')
.onClick(() => {
this.selectImage()
})
Image(this.imgSrc)
.width('50%').height('50%')
Text(this.message)
.fontSize(20).width('100%')
}
.width('100%').height('100%')
.padding(10)
}
}
各位 麻烦帮忙看下,如果服务器地址错误的话,不会卡死,但是如果服务器地址配置正确前端会卡死,但是图片能传上去。
更多关于HarmonyOS 鸿蒙Next关于选择图片上传后app卡死问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,选择图片上传后应用卡死可能是由于以下几个原因导致的:
-
内存泄漏:应用在处理图片时可能未正确释放内存,导致内存占用过高,最终引发卡死。可以通过检查代码,确保在图片处理完成后及时释放相关资源。
-
主线程阻塞:图片上传和处理可能是在主线程中进行的,导致UI线程被阻塞,界面无法响应。建议将图片上传和处理操作放到子线程中执行,避免阻塞主线程。
-
图片尺寸过大:如果选择的图片尺寸过大,处理时可能会消耗大量CPU和内存资源,导致应用卡死。可以在上传前对图片进行压缩或裁剪,减少资源消耗。
-
异步任务未正确处理:如果使用了异步任务处理图片上传,但未正确处理任务完成或失败的回调,可能导致应用状态异常。确保所有异步任务都有正确的回调处理逻辑。
-
系统资源不足:在多任务环境下,系统资源可能被其他应用占用,导致当前应用无法获得足够资源而卡死。可以通过优化应用资源使用,减少对系统资源的占用。
-
API调用问题:可能是调用的鸿蒙API存在bug或使用不当,导致应用卡死。检查API调用是否符合规范,确保使用最新版本的SDK。
-
第三方库问题:如果使用了第三方库进行图片处理或上传,可能是这些库存在兼容性或性能问题。检查并更新第三方库到最新版本,或替换为更稳定的库。
通过以上几点的排查和优化,可以有效解决HarmonyOS Next中图片上传后应用卡死的问题。