gpt4 book ai didi

android - Android 内存分配如何与 ImageView 配合使用?

转载 作者:行者123 更新时间:2023-11-29 02:08:18 25 4
gpt4 key购买 nike

我正在从服务器加载大约 20 张大小为 50-70K 的图片,然后将它们显示在 ListView 中。最初我将数据存储为 Bitmap,这会导致内存快速耗尽。然后我决定压缩所有这些位图文件并存储在 Content provider Media 中。所以在我的适配器中,用户数据只包含图像文件的 Uri

但是它根本没有解决问题,它运行的时间长了一点,但在加载大约 10 张图片后仍然崩溃。这是编译器的错误日志。
1048576 字节的外部分配对于这个进程来说太大了
VM 不允许我们分配 1048576 字节

在将每个位图数据设置到我的ImageView之后,我什至清理了它,并删除了存储在我的sdcard中的所有图像文件>

    @Override
public void onDestroy() {
// clean up
for (User user : userList) {
getContentResolver().delete(user.getImageUri(), null, null);
}
super.onDestroy();
}


private Uri constructUriFromBitmap(Bitmap bitmap) {
ContentValues values = new ContentValues(1);
values.put(Media.MIME_TYPE, "image/jpeg");
Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
try {
OutputStream outStream = getContentResolver().openOutputStream(uri);
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, outStream);
outStream.close();
}
catch (Exception e) {
Log.e(TAG, "exception while writing image", e);
}
bitmap.recycle();
return uri;
}

现在我没主意了,我真的不知道在这种情况下会出什么问题。我想知道是否有人遇到过这个问题可以给我一些启发?

由于代码比较长,我只摘录了主要的功能:这是我的 User class 数据:

public class FriendFeed {
// required parameters
private final int activityId; // in case we want to handle the detail of
// this activity
private final int friendId;
private final String friendName;
private final Challenge.Type challengeType;
private final String activityTime;
private final String placeName;

// optional parameter
private String challengeName;
private String challengeDescription;
private Uri activitySnapPictureUri = null;
private Uri friendPictureUri = null;
private String activityComment;

这是我的主要功能:

@Override
protected Boolean doInBackground(Void...voids) {
JSONArray array = JsonHelper.getJsonArrayFromUrlWithData(GET_FRIEND_FEED_URL, datas);
if (array != null) {
try {
for (int i = 0; i < array.length(); ++i) {
Uri snapPictureUri = null;
Uri userPictureUri = null;

if (Challenge.returnType(array.getJSONObject(i).getString("challenges_tbl_type")) == Challenge.Type.SNAP_PICTURE) {
snapPictureUri = constructUriFromBitmap(ImageHelper.downloadImage(array.getJSONObject(i).getString("activity_tbl_snap_picture_url")));
}

if(ImageHelper.downloadImage(array.getJSONObject(i).getString("users_tbl_user_image_url")) != null) {
userPictureUri = constructUriFromBitmap(ImageHelper.downloadImage(array.getJSONObject(i).getString("users_tbl_user_image_url")));
}

publishProgress(
new FriendFeed.Builder(
// required parameters
array.getJSONObject(i).getInt("activity_tbl_id"),
array.getJSONObject(i).getInt("friends_tbl_friend_id"),
array.getJSONObject(i).getString("users_tbl_username"),
Challenge.returnType(array.getJSONObject(i).getString("challenges_tbl_type")),
array.getJSONObject(i).getString("activity_tbl_created"),
array.getJSONObject(i).getString("spots_tbl_name"))
// optional parameters
.challengeName(array.getJSONObject(i).getString("challenges_tbl_name"))
.challengeDescription(array.getJSONObject(i).getString("challenges_tbl_description"))
.activitySnapPictureUri(snapPictureUri)
.friendPictureUri(userPictureUri)
.activityComment(array.getJSONObject(i).getString("activity_tbl_comment"))
.build());
}
}
catch (JSONException e) {
Log.e(TAG + "GetFriendFeedTask.doInBackGround(Void ...voids) : ", "JSON error parsing data" + e.toString());
}
return true;
}
else {
return false;
}
}

最佳答案

Android 强制执行 24MB 的每个进程内存分配限制,因此您不能分配超过该限制。然而,20 张 70K 的图片每张应该只有 1.4MB……所以我的猜测:

  1. 也许您正在应用的其他部分分配位图,因此此 ListView 上的位图可用空间不足 1.4MB。

  2. 某处内存泄漏

  3. 如果您确定您确实需要您正在使用的所有位图,您确定您需要这么大的位图或具有这么高的分辨率吗?减少它们会有所帮助。

如果所有其他方法都失败并且您确实需要内存中的大量位图,您始终可以使用 OpenGL 纹理。

关于android - Android 内存分配如何与 ImageView 配合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8762647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com