gpt4 book ai didi

java - 更快加载数据的建议

转载 作者:太空狗 更新时间:2023-10-29 15:08:35 24 4
gpt4 key购买 nike

我正在寻找从 SQLite 加载 20 项的速度快于 5 秒(这是我现在正在加载的秒数)的解决方案。 - 首先,我使用的是自定义 Listview 适配器。

我在 1 秒内加载了 5 个项目。我尝试加载 20 个项目,我在 5 秒内加载了它们。这是我从数据库中检索的字段:int、String、String、int、Bytes、float、int。

如您所想,在获取字节后,我将它们转换为位图。

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 网络服务中,我开发了一个函数来将图像大小调整为一半并将它们转换为 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";

}

通过这个解决方案,我将加载 47 个项目的时间缩短到 惊人的 1 秒!!

最佳答案

我建议检查其中一个 java.nio.* 包来加载您的图像。 NIO 是非阻塞的,这意味着您可以异步加载图像,从而每次完成更多的工作。

NIO 还在系统上(在 jvm 之外)使用 native 缓冲区,因此它可以防止 java 必须将内容读入它的堆中,这再次使事情变得更快( native )。在这里使用 NIO 也有很多好处。

关于java - 更快加载数据的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19186415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com