如何从服务器保存图像并在以后重用

时间:2015-11-03 08:00:00

标签: android imageview android-service

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

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

所以这一点还有三点

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

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

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

    1. 从设备中搜索最后下载的图像并将它们显示在网格视图中不是很费时间吗?
    2. 感谢您阅读这么久的问题。

2 个答案:

答案 0 :(得分:4)

我会尽力使其尽可能清晰:

  • 在本地db(sqlite)中创建一个表,并将其名称设置为" Image Paths"包含3列," image_id" " image_path" " image_name"
  • 安装后第一次启动应用时,请执行以下操作,检查表是否为空:

    ..-mainFolder 
    ...................-subFolder1 
    ..................-subFolder2 
    
  • 如果表格为空,则表示应用程序第一次运行或用户已删除私有应用程序数据,之后您需要从服务器下载整个图像列表。< / p>

  • 现在,当您将图像下载到设备时,您应该在internal memory中创建一个单独的文件夹,该文件夹应该仅限于您的应用,为此:

    // 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; } }
    
  • 然后,您应该将每个图像的名称及其访问路径保存到我们刚刚在步骤1中创建的表中。

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

  • 如果您希望用户无法使用清除数据按钮删除您应用的数据,则可以使用// write images privately FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); fos.write(string.getBytes()); fos.close(); 属性将其隐藏在清单文件中,例如:

    android:manageSpaceActivity

修改

发表评论后,私下在内部存储器中创建一个文件夹并将文件保存在其中:

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

答案 1 :(得分:1)

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

我认为你已经下载了这些图像,然后你应该将图像保存到你的sdcard内存中,并使用编号,这样你就可以在以后的启动中检查它们是否存在。

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

例如:image_1,image_2,..... image_10。 (下载图像到SD卡)

在“活动”或您想要的任何位置检查image_1是否不存在,然后使用相同的文件名(文件路径)下载并编写它。

从sdcard中检查不会消耗这么多时间,无论你在GridView中使用它们的哪个地方。

检查链接是否需要,如何从urlto sdcard(外部存储)保存图像: Android - Save image from URL onto SD card

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

那是所有人。

谢谢