- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在使用图像加载器类在 ListView 中进行延迟加载。它工作正常,但我一直在处理大量将从网络服务下载的位图。所以现在我得到的位图大小超出了 VM 预算。将 bitmapfactory 大小增加到 32*1024,但如果再次达到 32mb,则会抛出错误。在过去的一周里,这让我很伤心。所以有人请帮我解决这个问题。我在这里也发布了我的图像加载器类,请让我知道我应该在哪里以及如何解决这个问题。
public class ImageLoader {
private HashMap<String, Bitmap> cache=new HashMap<String, Bitmap>();
Bitmap bitmap = null;
private Activity activity;
PhotosLoader photoLoaderThread=new PhotosLoader();
public ImageLoader(Activity activity){
this.activity = activity;
photoLoaderThread.setPriority(Thread.NORM_PRIORITY-1);
clearCache();
}
public void DisplayImage(String url, Activity activity, ImageView imageView, String[] imageUrl){
this.activity = activity;
if(cache.containsKey(url)){
imageView.setImageBitmap(cache.get(url));
}
else{
imageView.setImageResource(R.drawable.icon);
queuePhoto(url, activity, imageView);
}
}
private void queuePhoto(String url, Activity activity, ImageView imageView){
this.activity = activity;
photosQueue.Clean(imageView);
PhotoToLoad p=new PhotoToLoad(url, imageView);
synchronized(photosQueue.photosToLoad){
photosQueue.photosToLoad.push(p);
photosQueue.photosToLoad.notifyAll();
}
if(photoLoaderThread.getState()==Thread.State.NEW)
photoLoaderThread.start();
}
public Bitmap getBitmap(String url, int sampleSize) throws Exception{
Bitmap bm = null;
try {
URL request = new URL(url);
InputStream is = (InputStream) request.getContent();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inDither = true;
options.inPurgeable = true;
options.inInputShareable = true;
options.inSampleSize = sampleSize;
options.inTempStorage = new byte[32 * 1024];
bm = BitmapFactory.decodeStream(is, null, options);
if (bm!=null)
bm = Bitmap.createScaledBitmap(bm, 115,100, true);
is.close();
is = null;
} catch (IOException e) {
throw new Exception();
} catch (OutOfMemoryError e) {
bm.recycle();
bm = null;
System.gc();
throw new Exception();
}
return bm;
}
private class PhotoToLoad{
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i){
url=u;
imageView=i;
}
}
PhotosQueue photosQueue=new PhotosQueue();
public void stopThread(){
photoLoaderThread.interrupt();
}
static class PhotosQueue{
private Stack<PhotoToLoad> photosToLoad=new Stack<PhotoToLoad>();
public void Clean(ImageView image){
for(int j=0 ;j<photosToLoad.size();){
try{
if(photosToLoad.get(j).imageView==image)
photosToLoad.remove(j);
else
++j;
}catch (Exception e) {
}
}
}
}
class PhotosLoader extends Thread {
public void run() {
try {
while(true){
if(photosQueue.photosToLoad.size()==0)
synchronized(photosQueue.photosToLoad){
photosQueue.photosToLoad.wait();
}
if(photosQueue.photosToLoad.size()!=0){
PhotoToLoad photoToLoad;
synchronized(photosQueue.photosToLoad){
photoToLoad=photosQueue.photosToLoad.pop();
}
Bitmap bmp = null;
bmp = getBitmap(photoToLoad.url, 1);
cache.put(photoToLoad.url, bmp);
if(((String)photoToLoad.imageView.getTag()).equals(photoToLoad.url)){
BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad.imageView);
Activity a=(Activity)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
if(Thread.interrupted())
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class BitmapDisplayer implements Runnable{
ImageView imageView;
public BitmapDisplayer(Bitmap b, ImageView i){
bitmap = null;
bitmap=b;
imageView=i;
}
public void run(){
if(bitmap!=null){
imageView.setImageBitmap(bitmap);
imageView.setScaleType(ScaleType.FIT_XY);
}
else{
imageView.setImageResource(R.drawable.icon);
}
}
}
public void clearCache() {
try{
cache.clear();
cache = new HashMap<String, Bitmap>();
bitmap.recycle();
System.gc();
}catch (Exception e) {
}
}
最佳答案
很简单,您正在尝试使用比 Android VM 提供给您的内存更多的内存。所以你需要少用。
你要么:
(1) 需要手动清除内存中的缓存 - 即一旦达到一定大小或数量的图像
或者替代地
(2) 使用 <String, SoftReference<Bitmap>>
类型的 HashMap以便垃圾收集器可以在图像不再显示时自动回收内存。
使用这两种方法中的任何一种,您的内存缓存都不会像以前那样大(这很好),因此您可能希望将文件保存到磁盘,这样如果它们被清除就不必再次下载内存缓存。
关于android - 如何解决延迟加载位图中的 vm budget memory heap 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7538317/
运行 npm build --prod 时出现以下错误:Error: budgets: initial exceeded maximum budget. Budget 1.00 MB was not
当我尝试向 MySQL 表中插入内容时遇到此错误。可能的原因是什么?如何解决这个问题? “预算”的原始值为800元,插入后变成800,少了元。 最佳答案 这意味着您尝试插入的数据会溢出该列分配的存储空
本文关键词:LeetCode,力扣,算法,算法题,字符串,并查集,刷题群 题目地址:https://leetcode-cn.com/problems/get-equal-substrings-wit
问题 我向 Facebook 的广告集 API 发出请求,尝试使用以下 JSON blob 创建广告集,但收到的错误是“您的预算太低。此广告集的最低预算为 32.04 美元”。 广告组设置为使用 au
我的 ImageActivity 上有 ImageView 和一个按钮。单击该按钮时,会列出可用的图像,单击其中一张图像时,会将其加载到 ImageView 中。 ImageView XML:
我不断收到此错误,错误指向此代码: bitmap = BitmapFactory.decodeByteArray(pic1 , 0, pic1.length); 图片来自sqlite数据库,用户从手机
我知道,您可以找到数百个关于这个特殊主题的问题,但我已经阅读了其中的大部分,但它们没有帮助。这是堆栈跟踪: java.lang.OutOfMemoryError: bitmap size exceed
我遇到了一个 OutOfMemoryError 问题,即位图大小在更改 Droid 移动设备的方向时超出了 vm 预算(但在任何其他移动设备中都没有,例如 Android normal 和 Andro
我一直在使用图像加载器类在 ListView 中进行延迟加载。它工作正常,但我一直在处理大量将从网络服务下载的位图。所以现在我得到的位图大小超出了 VM 预算。将 bitmapfactory 大小增加
必须将所有 SD 卡图像加载到交错 View 中。当我将计数设置为 100 时,它显示交错 View 中的图像,但对于许多没有图像(例如 700/800)我使用 AsyncTask 但它显示 doin
抱歉,这似乎是一个重复的问题,但我认为我不符合已发布的任何建议的条件。 我的应用程序中有一个最多包含 20 张图片的图库。来回玩了一段时间后,我遇到了 OutOfMemoryError。 奇怪的是我没
这是我的代码: File file = new File(Jpeg文件大小为700kb的路径); InputStream in = null; try { in = new
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Android: Strange out of memory issue while loading an imag
我在追踪“位图大小超出 VM 预算”错误时遇到了很大的问题。我查看了其他问题,并尝试了所有建议(取消分配资源,使用 bitmap.recycle() 并将变量、位图、 Canvas 设置为空,当 Ac
下面的代码直到今天都可以正常工作。但我现在不知道它不工作并给出以下错误。你能告诉我为什么吗? Error: Function DocumentReference.set() called with i
在 BitmapFactory 中获取异常。不确定是什么问题。 (嗯,我可以猜到这个问题,但不知道为什么会发生) ERROR/AndroidRuntime(7906): java.lang.OutOf
这个问题在这里已经有了答案: 关闭10年前. Possible Duplicate: Android: Strange out of memory issue while loading an ima
我知道参数 --virtual-time-budget in the source 的文档Chromium,但我觉得我不理解它: // If set the system waits the spec
每当我在模拟器上测试时,我都会收到上述错误,但在我测试过的任何设备上都不会。任何人都可以提出为什么会发生这种情况吗? 最佳答案 您可能正在具有 32Mb 或更多堆大小内存的高端设备上进行测试。模拟器可
我尝试在单击按钮时加载动画。我在资源文件夹中有 90 张图片,我尝试加载它们,每张图片大约有。大小 50kb 当我点击按钮启动动画时,我得到了 OutOfmemory 异常。请检查以下代码。任何帮助将
我是一名优秀的程序员,十分优秀!