Android 无法分配内存
在这里,我无法在位图中分配内存。在这里,我附加了带有logcat的代码。谁能给它一个解决方案呢。我已经声明位图为空,即使我得到相同的错误Android 无法分配内存,android,Android,在这里,我无法在位图中分配内存。在这里,我附加了带有logcat的代码。谁能给它一个解决方案呢。我已经声明位图为空,即使我得到相同的错误 protected Void doInBackground(Void... voids) { if (phones != null) { Log.e("count", "" + phones.getCount()); if (phones.getCount() == 0) {
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个用户,并希望将其缩略图存储在内存中?
非常糟糕。请在
SelectUser
中仅存储图像的URL或URI,而不是此选项。然后,当需要显示时,使用以下库之一:
但是,如果您真的需要获取位图,您应该知道,使用MediaStore
的解决方案已经过时
改用BitmapFactory
。您可以阅读以下答案:
请参阅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(),
空,选项)
编辑
此外,要从联系人加载照片,您可以检查以下答案:
这对我很有用:
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);
}