0

В своём приложении я произвожу объёмные вычисления, а именно сравнения соответствующих пикселей на фото. Обе фотографии всегда имеют разрешение 1440х900. Это всё производится в отдельном потоке, в итоге приложение вылетает без ошибки и обои на смартфоне меняются всё время на одни и те же. С чем это связано?

    private void macPRC(Thread loading) {
    loading.start();
    photo();
    Thread DH = new Thread(() -> {
        prcD = eql(DBmp);
        prcH = eql(HBmp);
    });
    Thread JMk = new Thread(() -> {
        prcJ = eql(JBmp);
        prcMk = eql(MkBmp);
    });
    Thread MlP1 = new Thread(() -> {
        prcMj = eql(MlBmp);
        prcP1 = eql(P1Bmp);
    });
    Thread P2S = new Thread(() -> {
        prcP2 = eql(P2Bmp);
        prcS = eql(SBmp);
    });
    DH.start();
    JMk.start();
    while(DH.isAlive() || JMk.isAlive()){
        try {
            Thread.sleep(1000);
        } catch (Exception ignored){}
    }
    MlP1.start();
    P2S.start();
    while(MlP1.isAlive() || P2S.isAlive()){
        try {
            Thread.sleep(1000);
        } catch (Exception ignored){}
    }
    int max1 = Math.max(prcH, prcD);
    int max2 = Math.max(max1, prcJ);
    int max3 = Math.max(max2, prcMk);
    int max4 = Math.max(max3, prcMl);
    int max5 = Math.max(max4, prcP1);
    int max6 = Math.max(max5, prcP2);
    PRC = Math.max(max6, prcS);
    isLoading = false;
    motionHome.transitionToEnd();
}

Вот сам метод eql, в неё передаются Bitmap изображения которые уже есть в проекте, и она сравнивает каждое из них с изображением которое уже выбрано в галлерее.

    private int eql(Bitmap modelH){
    int k = 0;
Bitmap model = modelH;
model = reSize(model);

int width = model.getWidth(), height = model.getHeight();

for(int i = 0; i < width; i++){
    for(int j = 0; j < height; j++){
        int pxlModel = model.getPixel(i, j);
        int pxlImage = imageBitmap.getPixel(i, j);
        if(pxlModel == pxlImage){
            k++;
        }
    }
}

int sum = width * height;

double it = k * 100 * 2.1;

double prc = (it / sum) + 11;

if (prc > 100){
    prc  = 100;
}

return (int)prc;

}

Метод maxPRC запускается в отдельном потоке.

Логи:

        Accessing hidden method Lsun/misc/Unsafe;-        >getObject(Ljava/lang/Object;J)Ljava/lang/Object; (greylist, linking, allowed)
    2021-07-12 18:40:10.795 21940-22061/com.example.cringemetr W/mple.cringemet: Accessing hidden method Lsun/misc/Unsafe;->getLong(Ljava/lang/Object;J)J (greylist,core-platform-api, linking, allowed)
    2021-07-12 18:40:10.796 21940-22061/com.example.cringemetr W/mple.cringemet: Accessing hidden method Lsun/misc/Unsafe;->putInt(Ljava/lang/Object;JI)V (greylist, linking, allowed)
    2021-07-12 18:40:11.078 21940-21987/com.example.cringemetr V/FA: Not logging ad unit exposure. Less than 1000 ms. exposure: 263
    2021-07-12 18:40:11.078 21940-21987/com.example.cringemetr V/FA: Not logging ad exposure. Less than 1000 ms. exposure: 263
   2021-07-12 18:40:12.060 21940-22024/com.example.cringemetr W/mple.cringemet: Accessing hidden method Lsun/misc/Unsafe;->putObject(Ljava/lang/Object;JLjava/lang/Object;)V (greylist, linking, allowed)
   2021-07-12 18:40:12.131 21940-22024/com.example.cringemetr W/mple.cringemet: Accessing hidden method Lsun/misc/Unsafe;->getObject(Ljava/lang/Object;J)Ljava/lang/Object; (greylist, linking, allowed)
   2021-07-12 18:40:12.187 21940-21940/com.example.cringemetr I/DynamiteModule: Considering local module com.google.android.gms.ads.dynamite:0 and remote module com.google.android.gms.ads.dynamite:211512000
   2021-07-12 18:40:12.187 21940-21940/com.example.cringemetr I/DynamiteModule: Selected remote version of com.google.android.gms.ads.dynamite, version >= 211512000
    2021-07-12 18:40:14.197 21940-21953/com.example.cringemetr I/mple.cringemet: NativeAlloc concurrent copying GC freed 2805(239KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 6299KB/12MB, paused 476us total 117.778ms
    2021-07-12 18:40:17.492 21940-21987/com.example.cringemetr V/FA: Inactivity, disconnecting from the service
    2021-07-12 18:40:18.303 21940-21940/com.example.cringemetr I/mple.cringemet: Starting a blocking GC NativeAlloc
    2021-07-12 18:40:18.365 21940-21940/com.example.cringemetr I/mple.cringemet: Waiting for a blocking GC NativeAlloc
    2021-07-12 18:40:18.388 21940-21940/com.example.cringemetr I/mple.cringemet: WaitForGcToComplete blocked NativeAlloc on HeapTrim for 22.479ms
    2021-07-12 18:40:18.388 21940-21940/com.example.cringemetr I/mple.cringemet: Starting a blocking GC NativeAlloc
    2021-07-12 18:40:20.368 21940-21940/com.example.cringemetr I/mple.cringemet: Starting a blocking GC NativeAlloc
    2021-07-12 18:40:20.414 21940-21940/com.example.cringemetr I/mple.cringemet: Waiting for a blocking GC NativeAlloc
    2021-07-12 18:40:20.505 21940-21953/com.example.cringemetr I/mple.cringemet: NativeAlloc concurrent copying GC freed 2723(191KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 6236KB/12MB, paused 114us total 132.174ms
    2021-07-12 18:40:20.506 21940-21940/com.example.cringemetr I/mple.cringemet: WaitForGcToComplete blocked NativeAlloc on HeapTrim for 91.797ms
    2021-07-12 18:40:20.506 21940-21940/com.example.cringemetr I/mple.cringemet: Starting a blocking GC NativeAlloc
    2021-07-12 18:40:24.568 21940-21940/com.example.cringemetr I/mple.cringemet: Starting a blocking GC NativeAlloc
    2021-07-12 18:40:24.693 21940-21940/com.example.cringemetr I/mple.cringemet: Waiting for a blocking GC NativeAlloc
     2021-07-12 18:40:24.853 21940-21953/com.example.cringemetr I/mple.cringemet: NativeAlloc concurrent copying GC freed 3513(368KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 6283KB/12MB, paused 174us total 284.326ms
     2021-07-12 18:40:24.854 21940-21940/com.example.cringemetr I/mple.cringemet: WaitForGcToComplete blocked NativeAlloc on HeapTrim for 161.000ms
    2021-07-12 18:40:24.854 21940-21940/com.example.cringemetr I/mple.cringemet: Starting a blocking GC NativeAll
  • 2
    Не бывает вылетов без ошибки - смотрите внимательнее логи. Без логов вряд ли кто-то найдёт ошибки в такой портянке кода, тем более без контекста. Я бы поставил на OutOfMemoryError - картинки большие, а память на java-стороне ограничена намного меньшим объёмом чем общий размер RAM устройства. – woesss Jul 07 '21 at 11:01
  • @woesss логи оставил –  Jul 07 '21 at 22:25
  • https://ru.stackoverflow.com/q/797531/11515 - почитайте здесь про логи. От себя добавлю: нужно включить фильтр по своему приложению и искать лог ошибки сразу после вылета, не закрывая на устройстве сообщение что приложение упало. Если ничего интересного не видно - проверьте фильтр по процессу: там может появиться ваш процесс с пометкой (DEAD), переключитесь на него и поищите ещё. Если снова неудача - отключите фильтры и ищете во всём красном упоминание вашего приложения. Возможен вылет в нативе - его нужно искать без фильтров по строке символов * - ниже будет крэш-лог – woesss Jul 08 '21 at 03:48
  • @woess, логов, похожих на ошибку в Logcat я не нашёл, по этому выложил последние логи перед вылетом –  Jul 12 '21 at 15:46

0 Answers0