6

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

最佳实践有人吗?

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

4

4 回答 4

2

我会在数据库中有一个“我正忙于处理”标志。

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

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

于 2012-06-05T01:14:52.170 回答
1

本地广播很好。

让您的活动询问服务是否忙,并在完成活动之前向用户显示适当的消息。

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

于 2012-06-05T02:44:17.667 回答
0

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

并使用Shared Preferences保存一个标志,以通知其他活动正在进行中。当标志为真时表示工作正在进行中,当标志为假时表示工作已完成。

做这样的事情:

 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,那么您可以显示一个进度对话框来告诉用户等待。

于 2012-06-05T05:50:28.240 回答
0

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

于 2012-06-05T19:52:13.260 回答