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

标签 android imageview android-service

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

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

所以这一点还有三点

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

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

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

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

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

感谢阅读这么长的问题。

最佳答案

我会一步步讲清楚:

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

    // 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; } }
    
  • 如果表格为空,则表示应用程序是第一次运行或用户删除了私有(private)应用程序数据,无论是哪种方式,之后您都需要从服务器下载整个图像列表。

  • 当您现在将图像下载到设备时,您应该在 internal memory 中创建一个单独的文件夹。这应该仅对您的应用私有(private),为此:

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

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

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

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

编辑

评论后,在内存中私自创建一个文件夹,并在其中保存一个文件:

  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();

关于android - 如何从服务器保存图像并在以后重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33494031/

相关文章:

android - 与服务器实现长期通信的最佳方式

android - 错误 :Execution failed for task ':app:transformClassesWithMultidexlistForDebug' when I build project

android - android 中需要 Google api 客户端参数

java - android 崩溃报告中的奇怪堆栈

java - 按顺序显示 x 个 ImageView y 秒

Android 如何像 css 一样使用 xml 裁剪图像

java - 使用多个 ImageView 作为背景

android - Firebase Cloud Messaging onMessageReceived 不适用于 ShortcutBadger

android - 自定义复选框首选项

android - 在 Android 应用程序中使用信任代理