Фатальный сигнал 6 (SIGABRT) в AsyncTask Android - PullRequest
0 голосов
/ 14 января 2020

Я сжимаю Bitmap в asynctask и отправляю его в другое действие через Bundle, и я получаю этот cra sh. Я вызываю Bitmap.recycle () в моем коде. Когда-нибудь это работает должным образом, вот мой вывод Logcat.

Called getHeight() on a recycle()'d bitmap! This is undefined behavior!
2020-01-14 16:25:56.863 21779-22017/ W/Bitmap: Called getWidth() on a recycle()'d bitmap! This is undefined behavior!
2020-01-14 16:25:56.863 21779-22017/ W/Bitmap: Called getWidth() on a recycle()'d bitmap! This is undefined behavior!
2020-01-14 16:25:56.863 21779-22017/ W/Bitmap: Called getHeight() on a recycle()'d bitmap! This is undefined behavior!
2020-01-14 16:25:56.863 21779-22017/ W/Bitmap: Called getWidth() on a recycle()'d bitmap! This is undefined behavior!
2020-01-14 16:25:56.863 21779-22017/ W/Bitmap: Called getHeight() on a recycle()'d bitmap! This is undefined behavior!
2020-01-14 16:25:56.863 21779-22017/ W/Bitmap: Called getWidth() on a recycle()'d bitmap! This is undefined behavior!
2020-01-14 16:25:56.863 21779-22017/ W/Bitmap: Called getHeight() on a recycle()'d bitmap! This is undefined behavior!
2020-01-14 16:25:56.863 21779-22017/ W/Bitmap: Called getConfig() on a recycle()'d bitmap! This is undefined behavior!
2020-01-14 16:25:56.863 21779-22017/ W/Bitmap: Called getConfig() on a recycle()'d bitmap! This is undefined behavior!
2020-01-14 16:25:56.863 21779-22017/ W/Bitmap: Called hasAlpha() on a recycle()'d bitmap! This is undefined behavior!
2020-01-14 16:25:56.864 21779-22017/ A/Bitmap: Error, cannot access an invalid/free'd bitmap here!
2020-01-14 16:25:56.864 21779-22017/ A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 22017 (AsyncTask #5), pid 21779 

Вот код для сжатия изображения

private static void compressImage(final Bitmap bitmap, final Callback<Bitmap> gbCallback) {

    new AsyncTask<Void, Void, Bitmap>() {
        protected void onPreExecute() {
        }

        @Override
        protected Bitmap doInBackground(Void... params) {

            Bitmap image = getScaledImageCopy(bitmap);
            if (image != null) {
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                image.compress(Bitmap.CompressFormat.JPEG, 80, byteArrayOutputStream);

                byte[] byteArray = byteArrayOutputStream.toByteArray();
                image = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
                return image;
            } else {
                return null;
            }
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            gbCallback.call(bitmap);
        }
    }.execute(null, null, null);

 private static Bitmap getScaledImageCopyForUGC(Bitmap image) {
    try {
        int height = image.getHeight();
        int width = image.getWidth();
        return Bitmap.createScaledBitmap(image, 400, (400 * height) / width, true);
    } catch (Exception e) {
        if (image != null) {
            return Bitmap.createScaledBitmap(image, 300, 300, true);
        } else {
            return null;
        }
    }
}

1 Ответ

0 голосов
/ 14 января 2020

Кажется, что растровое изображение уже переработано. Вы не можете использовать переработанное растровое изображение. Вы должны убедиться, что растровое изображение не перерабатывается, что передается в compressImage. На данный момент вы можете проверить, был ли битмап переработан или нет, чтобы избежать ошибки.

if(!bitmap.isRecycled()){
    //bitmap is not recycled
}else {
    //bitmap is recycled, use a default placeholder
}
...