我想创建一个延迟加载适配器以与 Gallery 小部件一起使用。
也就是说 getView() 立即返回一个 ImageView ,稍后一些其他机制将异步调用其 setImageBitmap() 方法。为此,我创建了一个扩展 ImageView 的“惰性”ImageView。
public class GalleryImageView extends ImageView {
// ... other stuff here ...
public void setImage(final Looper looper, final int position) {
final Uri uri = looper.get(position);
final String path = looper.sharePath(position);
new Thread(new Runnable() {
@Override
public void run() {
GalleryBitmap gbmp = new GalleryBitmap(context, uri, path);
final Bitmap bmp = gbmp.getBitmap(); // all the work is here
handler.post(new Runnable() {
@Override
public void run() {
if (GalleryImageView.this.getTag().equals(uri)) {
setImageBitmap(bmp);
}
}
});
}
}).start();
}
}
当我在 Gallery 中缓慢滚动时,中心图像不断弹出到中心。这很难解释,确切地说,但这真的很烦人。我还对微调器适配器尝试了相同的方法,它在那里工作得很好。
有什么想法吗?
最佳答案
解决方案是实现一种更智能的方法来确定何时获取缩略图 - 当用户快速浏览列表时获取缩略图是毫无意义的。本质上,您想要在 Romain Guy 的 Shelves 中实现类似的东西申请。
要获得响应最快的图库,您需要实现某种形式的内存缓存并执行以下操作:
getView 的内存缓存中时才设置图像。设置一个标志,指示图像是否已设置或是否需要下载。您还可以在 SD 卡和内部存储器的缓存中维护一个内存,如果当前没有进行快速测试,则显示低分辨率(inSampleSize 设置为 16 或 8)版本,这将是可见的当只是滚动时 - 当用户松开并停留在图像上时,将加载高分辨率版本。OnItemSelectedListener(并确保在初始化时调用 setCallbackDuringFling(false))为所有需要下载的可见项目下载新缩略图如果用户手指向上(您可以使用 getFirstVisiblePosition 和 getLastVisiblePosition 来查找可见 View 的范围)OnItemSelectedListener 启动了下载 - 如果它不是然后启动一个。这是为了捕捉没有发生 throw 的情况,因此 OnItemSelected 永远不会做任何事情,因为在这种情况下它总是在手指按下时被调用。我会使用一个处理程序来延迟在你的画廊的动画时间开始下载(确保在调用 onItemSelected 或当你收到 ACTION_DOWN 时清除发布到此处理程序的任何延迟消息 事件。另请注意,默认的 Gallery 组件未正确实现 View 回收(它假设适配器中的每个位置都有一个独特的 View ,并且在这些项目离开屏幕时清除回收器,这使得它毫无意义)。 编辑: 仔细观察它并非毫无意义 - 但就下一个/上一个 View 而言,它不是回收器,而是用于避免为当前 View 调用 getView布局更改期间的 View 。
这意味着传递给 getView 方法的 convertView 参数将更经常地不为 null,这意味着您将膨胀很多 View (这是昂贵的) - 查看我对 Does a replacement for Gallery with View recycling exist? 的回答一些提示。 (PS:我已经修改了该代码 - 我会为布局阶段和滚动阶段使用不同的回收站,在布局阶段放置并根据它们的位置检索布局回收站中的 View ,如果您从垃圾箱中获得的 View 是非空的,因为它将是完全相同的 View ;在布局阶段后还清除布局回收站——这使事情变得更加快捷)
PS:在 OnItemSelected 中做的事情也要非常小心——也就是说,除非它在上面提到的地方,否则尽量少做。例如,我在 OnItemSelected 中的图库上方的 TextView 中设置了一些文本。只需将此调用移动到与我更新缩略图的位置相同的位置,就会产生明显的不同。
关于带有延迟图像加载适配器的android gallery view "stutters",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5758406/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub