我正在寻找从SQLite加载20个项目的解决方案,速度超过5秒(这是我现在加载的秒数。) - 首先,我使用的是自定义Listview适配器。
我在1秒内加载了5个项目。我试着装载20件物品,然后在5秒内加载它们。 这是我从数据库中检索的字段:int,String,String,int,Bytes,float,int。
您可能认为,在获取字节后,我将它们转换为Bitmap。
Bitmap image = convertBlobToImage(cursor.getBlob(4));
// Using this function:
public Bitmap convertBlobToImage(byte[] value){
byte[] new_value = Base64.decode(value, 0);
return BitmapFactory.decodeByteArray(new_value, 0, new_value.length);
}
因此,在我的类字段中,它们将获得而不是字节但已经是位图。 读取时间的原因之一可能是位图。我刚刚对Paint做了一个测试。我在BMP中保存了两个相同的图像,在JPG中保存了另一个。 JPG图像的大小为2,87KB,BMP 420KB !!
使用上面的代码,我得到的结果是什么?可能其中一个解决方案可能是:http://www.mkyong.com/java/how-to-convert-byte-to-bufferedimage-in-java/?
你们觉得怎么样?感谢。
编辑: 我正在搜索,我发现了onDestroy()。此外,我没有实现“runOnUiThread”,我就这样说了。但我认为它没有给我任何更好的结果。你怎么看?这可以提高性能吗?
@Override
protected void onDestroy() {
super.onDestroy();
listView.setAdapter(null);
}
// And I also tried to put runOnUiThread:
runOnUiThread(new Runnable() {
@Override
public void run() {
Bundle extras = getIntent().getExtras();
if (extras != null) {
DatabaseHandler db = new DatabaseHandler(Produtos.this);
display_products = db.get_all_oc_product(extras.getString("category_id"));
listView = (ListView) findViewById(R.id.product_listview);
inputSearch = (EditText) findViewById(R.id.product_inputSearch);
adapter = new itemAdapter(Produtos.this,R.layout.row, display_products);
listView.setAdapter(adapter);
}
}
});
编辑(2):我设法在显示20个项目时减少了3秒的时间。我通过在查询后关闭与数据库的所有连接来实现此目的。我没有这样做。 正确的方式:
cursor db.query(...)
try{
// Code
} finally {
cursor.close();
db.close();
}
编辑(3):除了编辑(2)上的解决方案之外,我遇到的其中一个问题是图像问题。 所以,我开始看它们,我看到的图像是2000x1800和300kb甚至更多,我发现这就是问题。
因此,在PHP Web服务中,我开发了一个函数来将图像大小调整为一半并将它们转换为jpg。
function resize($filePath){
list($width, $height) = getimagesize($filePath);
$percent = 0.5;
$newwidth = $width * $percent;
$newheight = $height * $percent;
$thumb = imagecreatetruecolor($newwidth, $newheight);
$ext = pathinfo($filePath, PATHINFO_EXTENSION);
$source = null;
if($ext == "png"){
$source = imagecreatefrompng($filePath);
}else if($ext == "jpg" || $ext == "jpeg"){
$source = imagecreatefromjpeg($filePath);
}
// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
// Output
$temporary = "C:\\xampp\\htdocs\\MyExample\\images\\temporary\\" . basename($filePath);
imagejpeg($thumb, $temporary . ".jpg", 50);
ImageDestroy($thumb);
return $temporary . ".jpg";
}
通过这个解决方案,我减少了惊人1秒装载47件物品的时间!!
答案 0 :(得分:0)
从这个问题的另一方面提供帮助有点困难,但有一些通用提示:
使用某种类型的分析来确定哪个部分正在减慢您的速度。它是否正在加载实际光标,这是一个问题?还是字节转换?除非你测量,否则很难说 - 否则你可能会浪费大量时间来优化不会减慢你速度的东西。最简单的分析示例:
long startTime = SystemClock.elapsedRealTime();
suspectedSlowFunctionCall();
long endTime = SystemClock.elapsedRealTime();
Log.d(TAG, "Method duration: " + (endTime - startTime));
正如墨菲先生在评论中提到的,还有一些工具可以帮助您完成这项任务。 Android开发者网站有一个great post,展示了如何使用SDK中包含的traceview。
一般的智慧是,如果您可以避免将图像存储在数据库中。如果您存储文件路径并保存文件,则可以更轻松地调试和使用(以及加载系统)。
Android的BitmapFactory应该能够处理JPEG。如果您想使用JPG,请随意
如果某些内容非常慢,请不要在UI线程上执行此操作!使用AsyncTask
之类的东西进行慢速操作,并在加载时逐一向用户显示结果。这总是比在用户等待混淆时停止的操作更可取。
答案 1 :(得分:0)
我建议您查看其中一个java.nio.*
个包来加载您的图片。 NIO
是非阻塞的,这意味着您可以异步加载图像,从而导致每次完成更多工作。
NIO
也在系统上使用了本机缓冲区(在jvm之外),因此它可以防止java必须将内容读入其堆中,这也会使事情变得更快(本机)。这里使用NIO
还有很多好处。