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

2 回复

您好,请您通过在线提单进一步解决:https://developer.huawei.com/consumer/cn/support/feedback/#/,感谢您的反馈和支持

更多关于HarmonyOS 鸿蒙Next关于选择图片上传后app卡死问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,选择图片上传后应用卡死可能是由于以下几个原因导致的:

  1. 内存泄漏:应用在处理图片时可能未正确释放内存,导致内存占用过高,最终引发卡死。可以通过检查代码,确保在图片处理完成后及时释放相关资源。

  2. 主线程阻塞:图片上传和处理可能是在主线程中进行的,导致UI线程被阻塞,界面无法响应。建议将图片上传和处理操作放到子线程中执行,避免阻塞主线程。

  3. 图片尺寸过大:如果选择的图片尺寸过大,处理时可能会消耗大量CPU和内存资源,导致应用卡死。可以在上传前对图片进行压缩或裁剪,减少资源消耗。

  4. 异步任务未正确处理:如果使用了异步任务处理图片上传,但未正确处理任务完成或失败的回调,可能导致应用状态异常。确保所有异步任务都有正确的回调处理逻辑。

  5. 系统资源不足:在多任务环境下,系统资源可能被其他应用占用,导致当前应用无法获得足够资源而卡死。可以通过优化应用资源使用,减少对系统资源的占用。

  6. API调用问题:可能是调用的鸿蒙API存在bug或使用不当,导致应用卡死。检查API调用是否符合规范,确保使用最新版本的SDK。

  7. 第三方库问题:如果使用了第三方库进行图片处理或上传,可能是这些库存在兼容性或性能问题。检查并更新第三方库到最新版本,或替换为更稳定的库。

通过以上几点的排查和优化,可以有效解决HarmonyOS Next中图片上传后应用卡死的问题。

回到顶部