NativeScript: java .lang.OutOfMemoryError при загрузке или съемке - PullRequest
0 голосов
/ 12 февраля 2020

Я создаю приложение для работы, которое загружает изображение из галереи или самой камеры, а затем отображает изображение. Он работает для первых 4-6 изображений, но затем он дает мне java.lang.OutOfMemoryError, показанный ниже.

Я искал формы и попытался использовать global.gc(), а также добавил:

android:hardwareAccelerated="true" 
android:largeHeap="true" 

до манифеста android, и даже изменение размера изображения, однако, ничего не помогло.

Я не знаю, относится ли это к делу, но я использую nativescript-sqlite для хранения текста, а также ссылку на место хранения изображений. Так что, может быть, кто-то с опытом работы с sqlite может сказать мне, есть ли у sqlite возможность генерировать этот тип ошибки

Буду очень признателен за любые мысли или идеи, такие как, как go о отслеживании утечек памяти или любого другого ввода, было бы замечательно !!

Код, используемый для загрузки / сделайте снимок

Существует три метода, последние два вызывают первый, в котором проблема, я считаю.

public imageProcessing(imageAsset): Promise<any> {
    // Converting it to an ImageSource object
    return new Promise((resolve, reject) => {
      const source = new ImageSource();

      //It does NOT get past the following line
      // ######################################
      source.fromAsset(imageAsset)
        .then((imageSource: ImageSource) => {
          // Sets the new image to the correct variables
          let base64Picture = imageSource.toBase64String("jpeg", 75);
          this.itemPictureSource = imageSource;
          this.base64_picture_original =  base64Picture;
          // Analyzes the picture
          resolve("Picture finishing analysis");
        })
        .catch(err => {
          console.log("The error is:")
          console.log(err)
          reject();
        })
    })
  }


public onChoosePictureTap(): void {
    this.imageFromLibrary = true
    let context = imagepicker.create({mode: "single" });
    context.authorize().then(() => {
        return context.present();
    })
    .then((selection) => {
      let imageAsset = selection[0]; 
      this.imageProcessing(imageAsset)
    })
  }

private getPicture(): Promise<any> {
    let pictureOptions: CameraOptions = { 
      saveToGallery: true, 
      allowsEditing: true,
      keepAspectRatio: true,
      height: 800,
      width: 600
    }
    return new Promise((resolve, reject) => {
      requestPermissions().then(() => {
        // Taking the picture
        takePicture(pictureOptions).then((imageAsset: ImageAsset) => {
            this.imageProcessing(imageAsset)
            .then(() => {   resolve()   })
            .catch(() => {  reject()    })
          }, (error) => {
            reject("Problem with taking a picture")
          });
        },
        () => reject("Camera Permissions rejected")
      );
    })
  }




Ошибка

AssetPicturePageComp…ent.ngfactory.js:21 
ERROR Error: java.lang.OutOfMemoryError: Failed to allocate a 18662412 byte allocation with 6832792 free bytes and 6MB until OOM
    dalvik.system.VMRuntime.newNonMovableArray(Native Method)
    android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
    android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:613)
    android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:636)
    com.tns.Runtime.callJSMethodNative(Native Method)
    com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1242)
    com.tns.Runtime.callJSMethodImpl(Runtime.java:1122)
    com.tns.Runtime.callJSMethod(Runtime.java:1109)
    com.tns.Runtime.callJSMethod(Runtime.java:1089)
    com.tns.Runtime.callJSMethod(Runtime.java:1081)
    com.tns.NativeScriptActivity.onActivityResult(NativeScriptActivity.java:53)
    android.app.Activity.dispatchActivityResult(Activity.java:7226)
    android.app.ActivityThread.deliverResults(ActivityThread.java:4521)
    android.app.ActivityThread.handleSendResult(ActivityThread.java:4568)
    android.app.ActivityThread.-wrap22(ActivityThread.java)
    android.app.ActivityThread$H.handleMessage(ActivityThread.java:1706)
    android.os.Handler.dispatchMessage(Handler.java:102)
    android.os.Looper.loop(Looper.java:154)
    android.app.ActivityThread.main(ActivityThread.java:6688)
    java.lang.reflect.Method.invoke(Native Method)
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

ERROR Error: java.lang.OutOfMemoryError: Failed to allocate a 44769200 byte allocation with 8609656 free bytes and 8MB until OOM
    com.tns.Runtime.callJSMethodNative(Native Method)
    com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1242)
    com.tns.Runtime.callJSMethodImpl(Runtime.java:1122)
    com.tns.Runtime.callJSMethod(Runtime.java:1109)
    com.tns.Runtime.callJSMethod(Runtime.java:1089)
    com.tns.Runtime.callJSMethod(Runtime.java:1081)
    com.tns.NativeScriptActivity.onActivityResult(NativeScriptActivity.java:53)
    android.app.Activity.dispatchActivityResult(Activity.java:7226)
    android.app.ActivityThread.deliverResults(ActivityThread.java:4521)
    android.app.ActivityThread.handleSendResult(ActivityThread.java:4568)
    android.app.ActivityThread.-wrap22(ActivityThread.java)
    android.app.ActivityThread$H.handleMessage(ActivityThread.java:1706)
    android.os.Handler.dispatchMessage(Handler.java:102)
    android.os.Looper.loop(Looper.java:154)
    android.app.ActivityThread.main(ActivityThread.java:6688)
    java.lang.reflect.Method.invoke(Native Method)
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
...