【问题标题】:Failed to allocate memory androidandroid分配内存失败
【发布时间】:2016-05-01 12:32:27
【问题描述】:

这里我无法在位图中分配内存。这里我附上了带有 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)

【问题讨论】:

    标签: android


    【解决方案1】:

    其实你做的事情很糟糕。
    您正在尝试将整个位图存储在 SelectUser 实例中。
    当然,我不知道你的任务,但只是想象一下。现在您只能选择一个用户。稍后,您将决定为多选用户添加功能。您将选择 20 个用户并希望将他们的缩略图存储在内存中?
    这很糟糕。请在SelectUser 中仅存储您的图像的 URL 或 URI,而不是这个。然后,当您需要显示它时,请使用以下库之一:

    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

    请参阅handling large bitmaps 的 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 行替换为:

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-12
      • 2011-08-23
      • 2014-03-03
      • 1970-01-01
      • 2012-07-24
      • 2013-02-19
      • 1970-01-01
      • 2018-03-23
      相关资源
      最近更新 更多