草庐IT

android - Adapter中Bitmaps的异步下载,重点在Bitmap.recycle()

coder 2023-11-27 原文

谁能告诉我如何为异步建立一个好的机制。下载用于 ListView/GridView 的图像? 有很多suggestions ,但每个只考虑典型要求的一小部分。

下面我列出了一些我和我的同事无法立即满足的合理因素(要求或需要考虑的事项)。
我不要求代码(尽管它会受到欢迎),只是一种按照描述管理位图的方法。

  1. 没有重复的下载器或位图
  2. 取消下载/分配不再需要或可能自动删除的图像(SoftReference 等)
  3. 注意:一个适配器可以有同一个 ID 的多个 View (对 getView(0) 的调用非常频繁)
  4. 注意:不能保证 View 不会丢失而不是被回收(考虑 List/GridView 调整大小或按文本过滤)
  5. View 和数据/逻辑的分离(尽可能)
  6. 没有为每次下载启动一个单独的线程(UI 明显变慢)。使用队列/堆栈(BlockingQueue?)和线程池,或类似的东西......但如果 Activity 停止,则需要结束它。
  7. 清除距离列表/网格中当前位置足够远的位图,最好仅在需要内存时清除
  8. 对每个要丢弃的位图调用 recycle()。
  9. 注意:外部内存可能不可用(始终或所有时间),如果使用,应尽快清除(仅限此处下载的图像)(考虑 Android 的 Activity 销毁/重新创建)
  10. 注意:数据可以更改:删除条目(多选和删除)和添加(在后台线程中)。应保留已下载的位图,只要它们链接到的条目仍然存在。
  11. setTextFilterEnabled(true)(如果基于ArrayAdapter的机制,会影响数组索引)
  12. 可在 ExpandableList 中使用(影响缩略图的显示顺序)
  13. (可选)下载 Bitmap 时,仅刷新相关的 ImageView(列表项可能非常复杂)

请不要针对个别点发布答案。我的问题是,我们越关注某些方面,其他方面就越模糊,Heisenberg-like .
每一个都增加了一个维度的难度,尤其是Bitmap.recycle,需要在运行和Activity销毁时调用(注意onDestroy,连onStop都可能调用不到)。
这也排除了 relying on SoftReferences .
It is necessary ,或者我得到 OutOfMemoryError 即使在任何数量的 gc、 sleep (20 秒,甚至)、yield 和 try-catch 中的巨大数组分配(以强制控制 OutOfMemory)后清零位图之后。
我是resampling位图已经。

最佳答案

检查这个例子。由于它被谷歌使用,我也使用相同的逻辑来避免 OutOfMemory 错误。

http://developer.android.com/resources/samples/XmlAdapters/index.html

基本上这个 ImageDownlaoder 就是您的答案(因为它涵盖了您的大部分要求),您也可以在其中实现一些。

http://developer.android.com/resources/samples/XmlAdapters/src/com/example/android/xmladapters/ImageDownloader.html

关于android - Adapter中Bitmaps的异步下载,重点在Bitmap.recycle(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8240502/

有关android - Adapter中Bitmaps的异步下载,重点在Bitmap.recycle()的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  3. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  4. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  5. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  6. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  7. ruby - 下载位置 Selenium-webdriver Cucumber Chrome - 2

    我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1

  8. ruby-on-rails - HTTParty 的内存问题和下载大文件 - 2

    这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e

  9. ruby - 强制浏览器下载文件而不是打开文件 - 2

    我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.

  10. ruby - 检查网络文件是否存在,而不下载它? - 2

    是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby​​不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案

随机推荐