Volley 加上列表适配器中的 OutOfMemoryError

2024-03-02

我在用凌空加 https://github.com/DWorkS/VolleyPlus图书馆。我正在展示ListView图像和文本视图没有错误,但是当我在这个列表视图中上下滚动很多时间时,它得到OutOfMemoryError并使应用程序崩溃。

Here is LogCat :

java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
        at java.lang.Thread.nativeCreate(Native Method)
        at java.lang.Thread.start(Thread.java:1063)
        at com.android.volley.RequestQueue.start(RequestQueue.java:135)
        at com.android.volley.cache.plus.SimpleImageLoader.newRequestQueue(SimpleImageLoader.java:353)
        at com.android.volley.cache.plus.SimpleImageLoader.<init>(SimpleImageLoader.java:130)
        at com.symnepal.adapter.ProductListAdapter.getView(ProductListAdapter.java:73)
        at android.widget.AbsListView.obtainView(AbsListView.java:2344)
        at android.widget.ListView.makeAndAddView(ListView.java:1864)
        at android.widget.ListView.fillDown(ListView.java:698)
        at android.widget.ListView.fillGap(ListView.java:662)
        at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4968)
        at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3398)
        at android.widget.AbsListView.onTouchMove(AbsListView.java:3774)
        at android.widget.AbsListView.onTouchEvent(AbsListView.java:3612)
        at android.view.View.dispatchTouchEvent(View.java:8388)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2424)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2158)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2314)
        at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1692)
        at android.app.Activity.dispatchTouchEvent(Activity.java:2739)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2275)
        at android.view.View.dispatchPointerEvent(View.java:8578)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4021)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3887)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3578)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3635)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5701)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5675)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5646)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5791)
        at android.view.InputEventReceiver.

这是我的适配器类:

public class ProductListAdapter extends BaseAdapter {

private Context mContext;
private List<Products> dataArray;

public ProductListAdapter(Context context, List<Products> d) {
    mContext = context;
    dataArray = d;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    View rowView = convertView;
    if (rowView == null) {
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.list_row_item_products, null);

        ViewHolder viewHolder = new ViewHolder();
        viewHolder.title = (TextView) rowView.findViewById(R.id.tvName);
        viewHolder.image = (ImageView) rowView.findViewById(R.id.list_image);

        rowView.setTag(viewHolder);
    }

    Products list;
    list = dataArray.get(position);

    ViewHolder holder = (ViewHolder) rowView.getTag();
    holder.title.setText(list.getName());

    DiskLruBasedCache.ImageCacheParams cacheParams = new DiskLruBasedCache.ImageCacheParams(mContext, "CacheDirectory");
    cacheParams.setMemCacheSizePercent(0.5f);
    SimpleImageLoader mImageFetcher = new SimpleImageLoader(mContext, null, cacheParams);
    mImageFetcher.get(list.getThumb(), holder.image);

    return rowView;
}

static class ViewHolder {
    TextView title;
    ImageView image;
}
}

请帮助我摆脱这个问题。


问题是您不断加载图像,但它们填充的内存随后并未释放。如果图像是位图,您可以简单地回收行测试,然后调用recycle()在上面。 你可能会使用这样的东西:

if (rowView == null) {
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.list_row_item_products, null);

        ViewHolder viewHolder = new ViewHolder();
        viewHolder.title = (TextView) rowView.findViewById(R.id.tvName);
        viewHolder.image = (ImageView) rowView.findViewById(R.id.list_image);

        rowView.setTag(viewHolder);
}
else {
    ViewHolder holder = (ViewHolder) rowView.getTag();
    if(holder.image.getDrawable() instanceof BitmapDrawable)
        ((BitmapDrawable) holder.image.getDrawable).getBitmap().recycle();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Volley 加上列表适配器中的 OutOfMemoryError 的相关文章

随机推荐

  • App Engine (Python) 数据存储区预调用 API 挂钩

    背景 假设我正在为 GAE 制作应用程序 并且我想使用API 钩子 http code google com appengine articles hooks html BIG EDIT 在这个问题的原始版本中 我描述了我的用例 但有些人正
  • 为什么有时 jQuery 选择器会返回类似“a.fn.init”的内容? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我不知道我的 Chrome 浏览器发生了什么 但突然出现了这样的行为 div my 控制台中的内容与以前完全不同 我曾经经历过一次 但后来又
  • NSOpenPanel 无法获得焦点

    首先 我对 Swift 完全陌生 如果我的问题看起来微不足道 我很抱歉 我想要一个非常简单的命令行程序 它打开一个对话框来选择文件或文件夹 该工具不得运行带有在 Dock 中弹跳的图标的实际完整应用程序 而是运行一些微妙的东西 就是这样 我
  • 使用 Direct2D/DirectWrite 确定文本边界框

    ID2D1RenderTarget DrawGlyphRun采用以下参数 D2D1 POINT 2F baselineOrigin in CONST DWRITE GLYPH RUN glyphRun in ID2D1Brush foreg
  • 如何将 pandas 中的字符串转换为日期时间格式?

    我有一个专栏I DATE数据框中的字符串 对象 类型称为train如下图所示 I DATE 28 03 2012 2 15 00 PM 28 03 2012 2 17 28 PM 28 03 2012 2 50 50 PM 如何转换I DA
  • 条件面板 R 中的多个条件闪亮

    在闪亮的应用程序中使用条件面板时是否可以有多个条件 我想隐藏几个选项卡的特定 UI 组件 以下是我正在尝试的内容 但当我有多个条件时它似乎并不适用 library shiny library shinyWidgets library shi
  • 缺少引用 OLEDB 连接类型的库

    我从以下代码中得到了SSIS 团队博客 http blogs msdn com b mattm archive 2008 08 22 accessing oledb connection managers in a script aspx转
  • 无法访问的服务 - appsactivity

    我今天在执行我的 google apps 脚本 webapp 时开始收到消息 无法访问服务 appsactivity 有谁知道是否会停电 无法访问的服务 appsactivity 之前的答案是正确的 但提到的问题现已作为重复项关闭 http
  • 使用 Python 和 Selenium 将照片上传到 Craigslist

    在windows10上使用python3 selenium和firefox 这个程序很简单 它直接跳转到 craigslists 的 发布新列表 页面 上传多张照片 然后提交 我遇到的问题是我无法控制对话框使用硒导航到正确的文件 brows
  • 多个 MessageDialog 应用程序崩溃

    I use MessageDialogues在我的应用程序的几个地方 问题是 无论何时MessageDialog 或系统警报 例如功能警告 处于活动状态 另一个我的MessageDialog被调用时 应用程序毫无例外地崩溃或崩溃Unatho
  • 不同用户的会话超时时间不同

    是否可以为不同的用户设置不同的会话超时 我需要为管理员提供 180 分钟的会话 为非管理员用户提供 20 分钟的会话 目前 所有用户的单个会话超时 我们正在使用 web config 密钥 任何帮助 将不胜感激 Setting Sessio
  • MICE 中的条形图不显示分类变量

    我正在使用miceR 中的包进行多重插补 我仅使用数值变量进行了几次插补 插补方法是预测均值匹配 当我使用stripplot imp 我可以看到所有变量的观察值和估算值 当我估算分类变量和数值变量的组合时 就会出现问题 数值变量的插补方法是
  • 为什么 Akka Streams 会吞掉我的异常?

    为什么异常在 import akka actor ActorSystem import akka stream ActorMaterializer import akka stream scaladsl Source object Test
  • 如何在android中对齐自定义对话框中心?

    我正在开发一个应用程序 我想将对话框显示为屏幕尺寸 所以我使用了下面的代码 我通过这里得到了解决方案警报对话框中未显示警报消息 https stackoverflow com questions 10432184 alert message
  • MySQL vs. SQL Server vs. Oracle [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直只使用MySQL 没有使用其他数据库系统 今天在公司会议上提出了一个问题 我很尴尬我不知道 对于开发人员来说 MS 或 Oracle
  • 日志在 yii2 中不起作用

    我想在 app log 中添加日志 我的配置文件 log gt traceLevel gt YII DEBUG 3 0 targets gt file gt class gt yii log FileTarget levels gt err
  • 如何多次执行带参数的 Rake 任务?

    这是不可能的invoke循环内相同的 rake 任务不止一次 https stackoverflow com questions 4822020 rake task in loop executes only first task 但是 我
  • 将PIL图像传递到google云视觉,无需保存和读取

    更新如下 有没有办法将 PIL 图像传递到谷歌云视觉 我尝试使用io Bytes io String and Image tobytes 但我总是得到 Traceback most recent call last C Users visi
  • 开发占用空间较小的 Spring Boot 应用程序

    为了让我们在 spring boot 中开发并在 Cloud Foundry 上运行的微服务占用空间更小 我们正在寻找实现这一目标的最佳方法 任何朝这个方向的输入或指示都将受到欢迎 最好总是从最低限度的依赖项开始向上构建应用程序 并且仅在需
  • Volley 加上列表适配器中的 OutOfMemoryError

    我在用凌空加 https github com DWorkS VolleyPlus图书馆 我正在展示ListView图像和文本视图没有错误 但是当我在这个列表视图中上下滚动很多时间时 它得到OutOfMemoryError并使应用程序崩溃