在数据库做一些繁重的后台工作时冻结和应用的最佳方法是什么?

时间:2012-06-05 00:59:47

标签: android database transactions

我有一个后台服务,每天在交易中做一些繁重的工作。如果用户此时正好启动应用程序,我希望他们坐下来直到完成(大约10秒左右)。在所有活动中,最好的方法是什么?检查服务是否在每个活动的“onResume”功能中运行?我们怎么知道它何时完成?当地的广播,我猜...

最佳实践?

更新:我设法停止“onResume”直到我的服务完成。问题是用户在此之前只看到一个空白屏幕。我在onResume暂停时尝试了progressdialogs和常规对话框。但它们只有在onResume返回时才会显示,并且会破坏目的。换句话说,在调用“show()”之后,“进度”对话框不会立即“显示”:(

4 个答案:

答案 0 :(得分:2)

我会在数据库中有一个' 我正在忙着处理 '标志。

应用程序应检查启动,然后以一种很好的方式锁定应用程序,然后检查说每隔x秒查看标志的状态。它可以在正常处理期间执行此操作,因此每个操作都会在本地和服务器上检查此标志,然后再启动。

似乎是一种简单的锁定方式。因此,您可能需要考虑争用(多个用户设置和取消设置)可能使用信号量类型的安排。

答案 1 :(得分:1)

本地广播很好。

让您的活动在服务繁忙时对其进行质询,并在完成活动之前向用户显示相应的消息。

服务完成后,让它发送一个已完成的意图。

答案 2 :(得分:0)

在您的服务中使用 AsyncTask 来执行繁重的数据库工作。

并使用共享首选项保存标志,以通知正在进行工作的其他活动。当flag为true表示正在进行中,当flag为false时表示已完成工作。

执行以下操作:

 private class DatabaseWork extends AsyncTask<String, Integer, Long> {


 protected void onPreExecute ()
  {
      //Set SharedPref flag = trueto notify other activities that work has been started.
   }
 protected Long doInBackground(URL... urls) {

      //Your database work
     return false;
 }

 protected void onProgressUpdate(Integer... progress) {
     //if you want to show progress to user
 }

 protected void onPostExecute(Long result) {
     //after complete your work set SharedPref flag = false to notify other activities that work has been finished.
 }

}

现在,您可以检查onCreate或onResume事件上的每个活动的SharedPref标志值。如果您找到了true,那么您可以显示一个进度对话框,告诉用户等待。

答案 3 :(得分:0)

我找到的最好的方法是创建一个&#34;加载活动&#34;它总是首先加载,并在安全的情况下将用户发送到主屏幕。