我在 Android 中有一个工程行业的编目应用程序。超过 30 万张设计图片已上传到 Android 设备。每天有超过 200 张新图像与设备同步。
有一个名为 CatalogDetail 的表,其中存储了设计的详细信息。它有大约 20 列用于存储不同的属性和两个图像路径,一个用于缩略图,另一个用于大图像。缩略图的平均大小约为 20KB,大图的平均大小约为 40KB。所有这些图像都存储在同一个文件夹中(不在数据库中)。30 万张图片的总大小约为 6GB。根据各种搜索条件,缩略图和简短描述显示在应用程序的网格中。
如果文件夹中有 5000 张图像,则应用程序可以正常工作,并且随着数据大小的增加,应用程序变得越来越慢。现在加载了 30 万张图片后,当我将 250 张图片(最终用户希望一次至少加载 250 张图片)加载到网格中时,加载到网格中相对较慢,但是当我尝试滚动时,它需要相当长的时间长时间(大约 10 – 15 秒),这是不可取的。
我分析了我的 SQL,并发现 SQL 并没有花费大量时间(获取数据不到 1 秒)。最后我发现,问题在于从文件夹中加载图像。图像存储在内部存储器中。该应用程序适用于三星 Galaxy Tab 750 10.1 英寸,配备 Android 3.1(蜂窝)操作系统、1GB RAM 和 16GB 内部存储器。该应用程序是使用 SDK 10 开发的。最终用户的基本要求之一是设计图像是非常专有的,它们应该从设备中复制。所以图像文件夹是隐藏的,不能在应用程序之外访问。
请让我知道如何提高性能。
1. 如果图像是索引,性能可以提高吗?是否可以索引(是否有任何可用的软件、应用程序等?
2.如果我在每个文件夹中保存 1000 张图像,如果我创建 300 个文件夹并从它们中访问图像,性能可以提高吗?但是这应该是最后一个选项,因为我必须重新加载所有图像并修改表中的图像位置
。3.线程可以帮助吗?(我真的不知道线程!)
请建议我如何提高性能。
谢谢你的帮助。
搜索功能将执行此方法:
private void ShowData() {
try {
Cursor countc = dal.getCursor("Select count(*) From Product " + whereCondition);
SQL = "Select ID as _id, Name, Code, ProductWeight, '" + fileLoc + "' || ImageLoc as ImageLoc, ReleaseDate From CatalogDetail " + whereCondition;
Cursor c = dal.getCursor(SQL + " Order By " + orderByField + " " + OrderSeq);
ProductGridView.setAdapter(new CatalogueListAdapter(this, c));
} catch (Exception e) {
e.printStackTrace();
}
}
这是将目录加载到网格的方式:
public class CatalogueListAdapter extends SimpleCursorAdapter {
private Context context;
private Cursor c;
public CatalogueListAdapter(Context context, Cursor c) {
super(context, R.layout.thumbnail, c, new String[] {}, new int[] {});
this.context = context;
this.c = c;
}
@Override
public View getView(int position, View inView, ViewGroup parent) {
View v = inView;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.thumbnail, null);
}
c.moveToPosition(position);
ImageView ivThumb = (ImageView) v.findViewById(R.id.thumbnail);
String imageLoc = this.c.getString(this.c.getColumnIndex("ImageLoc"));
if (imageLoc != null)
ivThumb.setImageURI(Uri.parse(imageLoc));
return v;
}
}