我有一个Android应用程序,可以从php远程服务器检索数据(图像+文本)并在GridView中显示它们。 我正在使用Loaders在后台进行操作。我有单独的图像和文本连接,因为检索图像需要更长时间,我想立即显示文本。从MySQL检索后,文本在服务器上用Json编码。在应用程序上,我正在解析Json对象并显示我需要的文本。
问题在于图像。我不确定用Json编码图像是不是一个好主意。此外,图像在数据库中保存为blob,为了使用Json对它们进行编码,我需要使用base64_encode(),之前效率不高。我已经看过很多关于此的帖子,但是当你需要获得一张图片时,它总是一个简单的例子。在我的情况下,我将检索多达30个小尺寸图像。
我的问题是,我可以继续我刚刚提出的内容,但似乎应该有更好的方法来做到这一点。你怎么看待这件事?我走错路了吗?
另外,我想在格栅视图准备好之后是否可以在gridview中单独显示每个图像(而不是等待所有图像准备好),就像在“Google Play App”的GridView中一样。我可以采取什么方法来实现这一目标?
先谢谢大家!
答案 0 :(得分:3)
我眼中的最佳方法是通过HTTP get请求将图像文件作为普通图像文件下载。当然,确保它是线程化的,并且有一个可以将请求排入队列的线程池,并且有2-3个线程可以通过并下载。
在保存它们方面,我个人会在数据库中从保存到blob,并选择将它们保存到应用程序私有目录中的持久存储中。将文件名作为其ID存储在您创建的数据库中的图像文件将更快地加载回来。
您还可以保留对ImageView的引用,并让它最初显示一个占位符,成功的HTTP请求将ImageView的位图替换为刚从存储中下载/读入的位图。
您还可以在所做的HTTP请求中进行一些图像缓存。
ImageView myImageView = findViewById(R.id.testImage);
URL url = new URL("http://www.website.com/image.jpg");
URLConnection connection = url.openConnection();
connection.setUseCaches(true);
Object response = connection.getContent();
if (response instanceof Bitmap) {
Bitmap bitmap = (Bitmap)response;
myImageView.setBitmap(bitmap);
}
查找LRUCache的使用可能会有所帮助,它可以为您执行大量的缓存功能。
查看this link at the Android Developer site以获得图像缓存的深入指南
修改强> 您可以使用Robert Rowntree的答案中的建议更有效地加载位图,以减少您的内存使用。该链接提供了使用较少内存加载位图的详细信息,如果您从通过Web下载并保存到本地存储的较大图像创建缩略图,则可以正常工作。
答案 1 :(得分:2)
IMO - 有两个问题,将图像通过网络移动到客户端并加载它们。
假设您使用http作为协议,您应该有一个针对http的多线程解决方案,如apache httpclient包中提供的那样。这样可以快速将图片传到手机上。
然后,你必须通过将它们放入内存和缓存来呈现图片。在这里,您可以考虑'gallery3D'应用程序对其网格和位图的作用,但通过该代码读取它非常复杂。
结帐 - http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
查看代码示例,以便从位图加载大拇指。