草庐IT

java - 我需要将多个图像下载到目录,以便可以离线访问内容

coder 2023-08-31 原文

我得到一些包含一些食物菜单项的 JSON 数据

请注意:这只是一个示例,有时会有超过 2 张图片,数组中还有更多菜单项!

{
  "menu": [
    {
      "url": "/api/v1/menu/1",
      "name": "Best Food",
      "description": "really nice food",
      "opening_time": "every day from 9am to 6pm",
      "contact_email": "info@food.com",
      "tel_number": "+54 911 3429 5762",
      "website": "http://bestfood.com",
      "images": [
        {
          "url": "https://blahblah/image1.jpg"
        },
        {
          "url": "https://blahblah/image2.jpg"
        }
      ]
    },

  ]
}

每个项目都有一些信息和一组图像 URL。

我正在使用 Glide 图像库处理这些图像,并使用 Retrofit 2.0 从端点下载 JSON 数据。此时一切都很好。

但是,我需要存储这些下载的数据以供离线访问。

目前,我在现有模型上使用 ORM Lite 将所有 JSON 数据存储在数据库中。这部分没问题。

但是,在我的数据库中,我只存储图像 URL,因为有人告诉我在数据库中存储图像(作为 blob)不是好的方法。

所以我的应用程序中有一个部分可以查看保存的菜单,如果用户选择,可以选择下载它以供离线访问。

此时值得一提的是,我已经在数据库中拥有原始菜单信息,因为用户必须首先查看菜单才能在数据库中获取它。

但问题是图像。

这是我不知道如何继续的地方,但我列出了我正在考虑的解决方案和问题,并希望人们能就什么是最佳行动方案向我提出建议。

  1. 使用服务下载图像。我觉得这是强制性的,因为我不知道会有多少图像,我希望即使用户退出应用程序也能继续下载

  2. Glide 有一个仅下载图像的选项,您可以配置其缓存所在的位置(内部私有(private)或外部公共(public)),正如我所读 herehere .问题是我对设置缓存大小感到不舒服,因为我不知道需要什么。我想设置无限。

  3. 我需要能够删除已保存的菜单数据,尤其是当它保存在外部公共(public)目录中时,因为当应用被删除等时它不会被删除,或者如果用户选择从内部删除已保存的菜单应用程序。为此,我想我可以将文件图像 URI 或整个已保存菜单的位置存储在数据库中,但不确定这是否是一个好方法

  4. 我在不同的来源和答案中读到,在这个仅将图像缓存到 SD 卡等的用例中,我应该特别使用网络库来执行此操作,以避免将位图分配到堆内存。我目前在我的应用程序中使用 OK HTTP。

最佳答案

我也在使用 ormlite 来存储带有 url 的对象,我在应用程序的“登录”屏幕后进行了同步,根据我的经验,我真的推荐这个库 https://github.com/thest1/LazyList

很简单:

ImageLoader imageLoader=new ImageLoader(context);
imageLoader.DisplayImage(url, imageView);

这个库使用外部 sd 上的 url 保存图像,关于内存问题的基本和简单配置,所以如果你实际上有两个或更多具有相同 url 的项目,这个库可以完美地工作,url 和 imageView 是参数,如果图像不在手机上,则开始新任务并在下载完成后将图像放入 View 中,顺便说一句,该库还保存编码后的图像,因此这些图片不会出现在图库中。 实际上你只需要这些文件来实现库:https://github.com/thest1/LazyList/tree/master/src/com/fedorvlasov/lazylist

如果你想操作一些文件,你可以在 FileCache 类中更改文件夹名称:

 public FileCache(Context context){
    //Find the dir to save cached images
    ...
        cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"LazyList");
    ...
}

其中“LazyList”是文件夹名称,您可以删除、移动等。 删除示例:

 /**
 * This method delete a file if exist
 */
public static void deleteFile(File file){
    if(file!=null && file.exists()) {
        file.delete();
    }
}

现在我了解了更多关于内存缓存和位图到堆内存的分配,第一次在线和离线操作图像,我推荐这个库,当你了解更多时,你可以实现和编辑这个库满足您的需求。

关于java - 我需要将多个图像下载到目录,以便可以离线访问内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33610106/

有关java - 我需要将多个图像下载到目录,以便可以离线访问内容的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  3. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  4. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  5. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  6. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  7. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  8. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  9. 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

  10. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

随机推荐