【问题标题】:How to save images from server and reuse later如何从服务器保存图像并在以后重复使用
【发布时间】:2015-11-03 07:59:59
【问题描述】:

我有一个应用程序,它在 google 上运行,但现在我们计划改变它的小工作以使其更小。当时它大约 60mb,这只是由于我们打包的图像数量。现在我们决定在构建的应用程序中发送更少的嵌入图像,然后让用户从服务器手动下载这些图像。但我对几件事感到困惑。这些如下。

  • 如何从服务器下载图像并将它们保存在设备中以重复使用。我的意思是说我们已经在服务器上上传了 10 张图片,用户下载了所有图片,现在如果我们的服务器没有新图片,那么保存在设备中的最后 10 张图片应该能够重复使用,并且不应该被应用程序下载再次。

所以这个点多了三个点

  • 1) 图片下载方式及下载地址
  • 2) 如果用户删除了一些下载的图像,那么如何检查哪些图像被删除并重新下载它们。
  • 3) 有没有办法将图像保存在用户无法在应用程序外看到它们并且无法删除它们的地方(以消除我的第二点)

我也有一个网格视图,我正在使用它们在网格中显示图像,用户单击图像并在新活动中打开真实图像并提供一些信息现在我对此也感到困惑,那就是

  1. 由于我们计划在 apk 中嵌入至少 10 张图像,因此我们需要在网格中显示它们(这很简单,因为我将它们从应用程序资源文件夹显示到网格视图中)。但是现在我们还必须从服务器下载图像,所以现在我们如何将图像填充到该网格视图中,以及我们如何跟踪哪个图像来自资源的哪个位置(如在以前的版本中,我有只是为了从drawable中获取它。但现在事情发生了变化和复杂)

所以简而言之,网格视图混合了本地应用程序图像和来自服务器的图像。

  1. 从设备中搜索最后下载的图像并将它们显示到网格视图中会不会很耗时?

感谢您阅读这么长的问题。

【问题讨论】:

  • 如果你想保存图像,那么你可以将图像作为 BLOB 或 Base64 存储在数据库中,然后用户不能删除该图像
  • 但我读到这不是一个好的做法,正如这里提到的stackoverflow.com/questions/19402818/…
  • @CoasMckey 检查我的答案

标签: android imageview android-service


【解决方案1】:

我会尽量一步一步讲清楚:

  • 在本地数据库(sqlite)中创建一个表,并将其名称命名为具有 3 列的“图像路径”,“image_id”“image_path”,“图像名称”
  • 当您的应用在安装后首次启动时,请执行以下操作检查表是否为空:

    // this will return true if the table has no data
    
    public static boolean checkTable(String q){
      DataBaseHelper dbh = new DataBaseHelper();
      SQLiteDatabase sqldb = dbh.createAndOpenDB();
      Cursor cd =null;
    try{
    
    
    boolean isEmpty=false;
    cd = sqldb.rawQuery(q, null);
    if(cd!=null){
        cd.moveToFirst();
        if(cd.getInt(0)==0){
            isEmpty = true;
        }
    }
    
    cd.close();
    dbh.closeDB();
    
    return isEmpty;}
    catch(Exception e){
        e.printStackTrace();
        if(cd!=null){
            cd.close();
            dbh.closeDB();
        }
        return false; } }
    
  • 如果表为空,则表示应用程序正在第一次运行或用户已删除私有应用程序数据,无论哪种方式,之后您都需要从服务器下载整个图像列表。

  • 当您现在将图像下载到设备时,您应该在 internal memory 中创建一个单独的文件夹,该文件夹应该只对您的应用程序私有,以执行此操作:

    // write images privately 
    FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
    fos.write(string.getBytes());
    fos.close();
    
  • 然后,您应该将每个图像的名称及其访问路径保存到我们刚刚在步骤 1 中创建的表中。

  • 因此,例如,如果您想从服务器更新图像,现在访问这些图像会更快、更可靠。假设您有一些要与设备同步的新图像,那么您应该制作另一个 versions 表,该表必须与服务器的版本表同步..(两者必须具有相同的表)因此,当您在步骤 2 中检查 image_path 表时,如果找到数据,那么您应该从服务器获取当前版本的列表并将它们与您的本地副本匹配。如果任何版本不匹配,则应相应更新。

  • 如果您希望用户无法使用 清除数据 按钮删除您应用的数据,那么您可以使用清单文件中的 android:manageSpaceActivity 属性将其隐藏,例如:

    android:manageSpaceActivity="com.main.slash.LaunchingActivity"
    

编辑

在你的cmets之后,在内存中私下创建一个文件夹并在其中保存一个文件:

  File mydir = context.getDir("mydir", Context.MODE_PRIVATE); //Creating an internal directory/folder;
  File imageFile1 = new File(mydir, "myfile"); //Getting a file within the dir.
  FileOutputStream out = new FileOutputStream(imageFile1);

  // to get the path of the file you can call the getPath() or getAbsolutePath() methods

  String path = imageFile1.getAbsolutePath();

【讨论】:

  • 您在回答中提到了很多很好的信息,现在假设我已经从 url 下载了图像,然后如何保存它上面提到的点,您说要在其中创建一个单独的文件夹内存
  • 存入内存后如何获取图片的完整路径存入数据库?
  • 但我无法理解你的这些措辞,但听起来真的很有用,因为我们必须对图像做一些类似的事情假设你有一些想要与设备同步的新图像那么你应该制作另一个版本表,它必须与服务器的版本表同步。(两者必须有同一个表)所以当你在步骤 2 中检查你的 image_path 表时,如果找到数据,那么你应该得到一个列表来自服务器的当前版本,并将它们与您的本地副本匹配。如果任何版本不匹配,那么您应该相应地更新。
  • 请让我明白你在说什么
  • 你能告诉我哪些措辞你听不懂吗?
【解决方案2】:

通过解析位图格式获取图像并将它们存储在您的应用数据库或 sdcard 中。

我认为您已经下载了图像,那么您应该将图像保存到您的 sdcard 内存中,并带有编号,以便您可以在以后启动时检查它们是否存在。

如果不存在,则下载相同的图像并以相同的名称保存到该位置。

例如:image_1、image_2、.....image_10。 (下载图片到sd卡)

在 Activity 或任何你想要的地方检查 image_1 是否不存在,然后下载并使用相同的文件名(文件路径)写入它。

从 sdcard 进行检查不会消耗太多时间,无论您在哪里使用它们,就像在 GridView 中一样。

如果需要,请查看链接,如何将图像从 url 保存到 sdcard(外部存储): Android - Save image from URL onto SD card

将图像从 sdcard 显示到 GridView 的链接: http://android-er.blogspot.in/2013/10/gridview-example-load-images-to.html

就是这样。

谢谢

【讨论】:

  • 但是还有其他几点,你正在回答我关于如何下载和保存它们的问题,我已经在我的许多其他应用程序中使用这些库来加载图像并显示它们而不会得到 OOM但现在有几种情况不容易理解,造成混乱
  • 很酷,但是将图像保存在 sd 卡上好吗?我的意思是如果用户没有插入 sd 卡或者他没有 sd 卡会发生什么?
  • 没问题老兄,然后它会占用你手机的android存储(内存),否则,你也可以将它们保存在你的应用程序的本地存储中,如果你想要数据库,sharedpreferences。
  • 请告诉我,如果我已经下载了 10 张图片,然后将它们保存在 sd 卡或其他任何地方,如何跟踪哪些图片已保存在哪里?
  • 您必须按照我所说的名称来跟踪它们,您曾经下载和写入它们,如果该名称(sdcard 上的文件)存在,则它不存在。无论在哪里,都可以使用数据库、共享首选项以及 sdcard(最简单的选项是 sd 卡)来完成。如果你很容易解决你的问题,那么请你做好工作,祝你好运谢谢
猜你喜欢
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2021-11-04
相关资源
最近更新 更多