簡體   English   中英

無法分配Android內存

[英]Failed to allocate memory android

在這里我無法在位圖中分配內存。這里我已經將代碼附加到logcat中了。 任何人都可以為此提供解決方案。 我已經聲明位圖為空,即使我遇到同樣的錯誤。

protected Void doInBackground(Void... voids) {
        if (phones != null) {
            Log.e("count", "" + phones.getCount());
            if (phones.getCount() == 0) {
                Log.d("No Contacts", "No Contacts");
            }

            while (phones.moveToNext()) {
               Bitmap bit_thumb = null;
                String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                String image_thumb = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
                try {
                    if (image_thumb != null) {
                        bit_thumb = MediaStore.Images.Media.getBitmap(resolver, Uri.parse(image_thumb));
                    } else {
                        Log.e("No Image Thumb", "--------------");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

                SelectUser selectUser = new SelectUser();
                selectUser.setThumb(bit_thumb);
                selectUser.setName(name);
                selectUser.setPhone(phoneNumber);
                selectUser.setCheckedBox();
                selectUsers.add(selectUser);
            }
        } else {
            Log.e("Cursor close 1", "----------------");
        }
        //phones.close();
        return null;
    }

原木貓是

1-25 14:21:04.616 1502-1617/com.jamol.contacts E/art: Throwing OutOfMemoryError "Failed to allocate a 2073612 byte allocation with 347044 free bytes and 338KB until OOM"
    01-25 14:21:04.616 1502-1617/com.jamol.contacts D/skia: --- decoder->decode returned false
    01-25 14:21:04.616 1502-1617/com.jamol.contacts E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #4
      Process: com.jamol.contacts, PID: 1502
      java.lang.RuntimeException: An error occured while executing doInBackground()
          at android.os.AsyncTask$3.done(AsyncTask.java:304)
          at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
          at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
          at java.util.concurrent.FutureTask.run(FutureTask.java:242)
          at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
          at java.lang.Thread.run(Thread.java:818)
       Caused by: java.lang.OutOfMemoryError: Failed to allocate a 2073612 byte allocation with 347044 free bytes and 338KB until OOM
          at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
          at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
          at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:863)
          at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:839)
          at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:877)
          at android.provider.MediaStore$Images$Media.getBitmap(MediaStore.java:860)
          at com.jamol.contacts.MainActivity$LoadContact.doInBackground(MainActivity.java:549)
          at com.jamol.contacts.MainActivity$LoadContact.doInBackground(MainActivity.java:527)
          at android.os.AsyncTask$2.call(AsyncTask.java:292)
          at java.util.concurrent.FutureTask.run(FutureTask.java:237)
          at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
          at java.lang.Thread.run(Thread.java:818)

其實,你在做什么事情是很糟糕的。
您試圖將整個位圖存儲在SelectUser實例中。
當然,我不知道您的任務,只是想像一下。 目前,您只能選擇一個用戶。 稍后,您將決定為多選用戶添加功能。 您將選擇20位用戶,並且要將其縮略圖存儲在內存中?
這很糟糕。 請代替此,僅將URL或圖像的URI存儲在SelectUser 然后,當您需要顯示它時,請使用以下庫之一:

http://square.github.io/picasso/

https://github.com/bumptech/glide

https://github.com/nostra13/Android-Universal-Image-Loader

但是,如果您確實需要獲取位圖,則應該知道,使用MediaStore的解決方案已過時。

請改用BitmapFactory
您可以閱讀以下答案:
https://stackoverflow.com/a/24135522/1796309

請參閱Android指南以處理大型位圖

特別是本節:

 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.id.myimage, options); int imageHeight = options.outHeight; int imageWidth = options.outWidth; String imageType = options.outMimeType; 

編輯

在您的情況下,您將使用以下decodeResource替換decodeResource行:

 BitmapFactory.decodeFileDescriptor(fileDescriptor.getFileDescriptor(), 

null,選項);

編輯

另外,要從聯系人中加載照片,您可以檢查以下答案:

https://stackoverflow.com/a/4240238/1796309

這對我有用:

 public static Bitmap loadContactPhoto(ContentResolver cr, long id) { Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id); InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri); if (input == null) { return null; } return BitmapFactory.decodeStream(input); } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM