0

我正在编写一个需要从数据库中写入和检索数据的应用程序。我想知道我是否应该在线程/Asynctask 中运行查询,因为它需要不到 100 毫秒,事实上,一个调用通常需要大约 30-70 毫秒(包括解析游标)。此调用仅从 2 个(不同的)数据库中的每一个中检索一行。如果我添加一个异步任务,时间会达到 120-170 毫秒(我猜是开销)。在这么短的时间内使用线程/异步任务是否值得(或更好的做法)?

4

5 回答 5

2

在 AsyncTask 上运行查询是个好习惯。一开始一切都很顺利,但是当数据库变大时,查询可能会超过第二次。然后您应该能够为用户显示等待对话框,而不仅仅是冻结 UI。

于 2012-12-02T15:52:24.363 回答
2

您想在单独的线程中运行数据库查询的原因是因为数据库是您无法完全控制的外部依赖项(在生产代码中)。这意味着即使您的查询通常在 100 毫秒内愉快地运行,有时会出现问题,您需要一种方法来处理查询甚至根本不返回的情况。通过将此功能封装在单独的线程中,您可以更好地控制出现问题时发生的情况。例如,如果数据库有问题,可以设置一个超时时间,在此之后您的代码可以假设发生错误并重试或终止挂起的查询线程,而不会导致整个程序被阻塞并需要重新启动接着说。有几种技术可以做我刚才所说的,所以我不能太具体,因为我不知道你的确切情况涉及什么以及可能的取舍。

Writing dependable multi-threaded code is hard work. I recommend you take the time to read and understand Goetz's book Java Concurrency in Practice to help you solve your concurrency problems.

于 2012-12-02T16:19:57.923 回答
1

任何会消耗时间的事情都不应该在主 UI 线程上完成。始终建议在异步任务中执行数据库操作。主要原因之一是您的操作时间指标会因手机配置和其他参数而异。

于 2012-12-02T15:55:23.200 回答
0

我认为当您需要实现并行性时,多线程是必要的。如果您的代码连续运行,我的意思是从头到尾一个接一个,那么您不需要线程。

于 2012-12-02T15:53:10.950 回答
0

如果您依赖于查询输出的结果,那么无论如何您都必须等待结果。

为了获得更好的数据库性能,请考虑使用Prepared Statement Caching(使用参数化的 Prepared statements)

这应该会增加一些性能。

于 2012-12-02T15:53:12.843 回答