如何从服务器保存图像并在以后重用
How to save images from server and reuse later
我有一个应用程序,它在 google 上运行,但现在我们计划更改它的小工作以减小它的大小。当时它大约 60mb,这只是由于我们打包的图像数量。现在我们决定在构建的应用程序中发送较少的嵌入图像,稍后让用户从服务器手动下载这些图像。但是我对几件事感到困惑。这些如下。
- 如何从服务器下载图片并将其保存在设备中以供重复使用。我的意思是说我们已经在服务器上上传了 10 张图片,用户下载了所有这些图片,现在如果我们的服务器没有新图片,那么保存在设备中的最后 10 张图片应该能够重复使用,而不应该被应用程序下载再次.
所以这一点还有三点
- 1) 如何下载和在哪里下载图片
- 2) 如果用户删除了一些已下载的图片,那么如何检查删除了哪些图片并重新下载它们。
- 3) 有什么方法可以将图像保存在用户无法在应用程序外看到它们并且无法删除它们的地方(以消除我的第二点)
我还有一个网格视图,我正在使用它们在网格中显示图像,用户单击图像,真实图像在新 activity 中打开,其中包含一些信息,现在我对此也感到困惑,并且那就是
- 因为我们计划在 apk 中嵌入至少 10 张图片,所以我们需要在网格中显示它们(这很简单,因为我将它们从应用程序资源文件夹显示到网格视图中)。但是现在我们还必须从服务器下载图像,所以现在我们如何将图像填充到该网格视图中以及我们如何跟踪哪个图像来自资源的何处(与以前的版本一样,我有只是为了从 drawable 中获取它。但现在事情发生了变化和复杂)
所以简而言之,网格视图混合了本地应用程序图像和来自服务器的图像。
- 从设备中搜索最后下载的图像并将它们显示在网格视图中会不会很耗时?
感谢阅读这么长的问题。
通过位图格式解析得到图片,并将其存储在您的应用程序数据库或sdcard中。
我认为你已经下载了图像,那么你应该将图像保存到你的 sdcard 内存中,并编号以便你可以在以后启动时检查它们是否存在。
如果不存在,则下载相同的图像并以相同的名称保存到该位置。
例如:image_1、image_2、.....image_10。 (已下载图片到 SD 卡)
在 Activity 或任何你想检查的地方,如果 image_1 不存在,然后下载并使用相同的文件名(文件路径)写入它。
从 sdcard 检查不会消耗太多时间,无论你在哪里使用它们,就像在 GridView 中一样。
检查link如果需要,如何将图像从 url 保存到 sdcard(外部存储):
Android - Save image from URL onto SD card
link 将 sdcard 中的图片显示到 GridView:
http://android-er.blogspot.in/2013/10/gridview-example-load-images-to.html
这就是所有的人。
谢谢
我会一步步讲清楚:
- 在本地数据库(sqlite)中创建一个 table 并将其名称命名为 "Image Paths" 3 列, "image_id" , "image_path","image_name"
当您的应用程序在安装后首次启动时,通过执行以下操作检查 table 是否为空:
// 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; } }
如果table为空则表示该应用是运行第一次使用或者用户已经删除了私有应用数据,无论哪种方式之后你都会想从服务器下载整个图像列表。
当您现在将图像下载到设备时,您应该在 internal memory 中创建一个单独的文件夹,该文件夹应该仅对您的应用程序私有,为此:
// write images privately
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
然后您应该将每个图像的名称及其访问路径保存到我们刚刚在步骤 1 中创建的 table。
因此,现在访问这些图像会更快、更可靠,例如,如果您想从服务器更新图像。假设您有一些要与设备同步的新图像,那么您应该制作另一个 table 的 版本 ,它必须与服务器的版本同步 [=69= 。您应该从服务器获取当前版本的列表,并将它们与您的本地副本相匹配。如果任何版本不匹配,那么您应该相应地更新。
如果您希望用户无法使用清除数据按钮删除您应用的数据,那么您可以使用[=14]隐藏它=] 清单文件中的属性例如:
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();
我有一个应用程序,它在 google 上运行,但现在我们计划更改它的小工作以减小它的大小。当时它大约 60mb,这只是由于我们打包的图像数量。现在我们决定在构建的应用程序中发送较少的嵌入图像,稍后让用户从服务器手动下载这些图像。但是我对几件事感到困惑。这些如下。
- 如何从服务器下载图片并将其保存在设备中以供重复使用。我的意思是说我们已经在服务器上上传了 10 张图片,用户下载了所有这些图片,现在如果我们的服务器没有新图片,那么保存在设备中的最后 10 张图片应该能够重复使用,而不应该被应用程序下载再次.
所以这一点还有三点
- 1) 如何下载和在哪里下载图片
- 2) 如果用户删除了一些已下载的图片,那么如何检查删除了哪些图片并重新下载它们。
- 3) 有什么方法可以将图像保存在用户无法在应用程序外看到它们并且无法删除它们的地方(以消除我的第二点)
我还有一个网格视图,我正在使用它们在网格中显示图像,用户单击图像,真实图像在新 activity 中打开,其中包含一些信息,现在我对此也感到困惑,并且那就是
- 因为我们计划在 apk 中嵌入至少 10 张图片,所以我们需要在网格中显示它们(这很简单,因为我将它们从应用程序资源文件夹显示到网格视图中)。但是现在我们还必须从服务器下载图像,所以现在我们如何将图像填充到该网格视图中以及我们如何跟踪哪个图像来自资源的何处(与以前的版本一样,我有只是为了从 drawable 中获取它。但现在事情发生了变化和复杂)
所以简而言之,网格视图混合了本地应用程序图像和来自服务器的图像。
- 从设备中搜索最后下载的图像并将它们显示在网格视图中会不会很耗时?
感谢阅读这么长的问题。
通过位图格式解析得到图片,并将其存储在您的应用程序数据库或sdcard中。
我认为你已经下载了图像,那么你应该将图像保存到你的 sdcard 内存中,并编号以便你可以在以后启动时检查它们是否存在。
如果不存在,则下载相同的图像并以相同的名称保存到该位置。
例如:image_1、image_2、.....image_10。 (已下载图片到 SD 卡)
在 Activity 或任何你想检查的地方,如果 image_1 不存在,然后下载并使用相同的文件名(文件路径)写入它。
从 sdcard 检查不会消耗太多时间,无论你在哪里使用它们,就像在 GridView 中一样。
检查link如果需要,如何将图像从 url 保存到 sdcard(外部存储): Android - Save image from URL onto SD card
link 将 sdcard 中的图片显示到 GridView: http://android-er.blogspot.in/2013/10/gridview-example-load-images-to.html
这就是所有的人。
谢谢
我会一步步讲清楚:
- 在本地数据库(sqlite)中创建一个 table 并将其名称命名为 "Image Paths" 3 列, "image_id" , "image_path","image_name"
当您的应用程序在安装后首次启动时,通过执行以下操作检查 table 是否为空:
// 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; } }
如果table为空则表示该应用是运行第一次使用或者用户已经删除了私有应用数据,无论哪种方式之后你都会想从服务器下载整个图像列表。
当您现在将图像下载到设备时,您应该在 internal memory 中创建一个单独的文件夹,该文件夹应该仅对您的应用程序私有,为此:
// write images privately FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); fos.write(string.getBytes()); fos.close();
然后您应该将每个图像的名称及其访问路径保存到我们刚刚在步骤 1 中创建的 table。
因此,现在访问这些图像会更快、更可靠,例如,如果您想从服务器更新图像。假设您有一些要与设备同步的新图像,那么您应该制作另一个 table 的 版本 ,它必须与服务器的版本同步 [=69= 。您应该从服务器获取当前版本的列表,并将它们与您的本地副本相匹配。如果任何版本不匹配,那么您应该相应地更新。
如果您希望用户无法使用清除数据按钮删除您应用的数据,那么您可以使用[=14]隐藏它=] 清单文件中的属性例如:
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();