6

1 日に 1 回、トランザクション内で重労働を行うバックグラウンド サービスがあります。この時点でユーザーがアプリを起動した場合は、終了するまで (約 10 秒程度) じっと座ってもらいます。すべてのアクティビティでこれを行う最善の方法は何ですか? 各アクティビティの「onResume」関数でサービスが実行されているかどうかを確認しますか? そして、それがいつ完了したかをどのように知ることができますか? まさかのローカル放送…

ベストプラクティスはありますか?

更新: サービスが完了するまで「onResume」を停止することができました。問題は、それまで空白の画面しか表示されないことです。onResume が一時停止している間に、progressdialogs と通常のダイアログを試しました。ただし、それらはすべて onResume が返されたときにのみ表示され、それが目的に反します。つまり、「show()」が呼び出された直後に進行状況ダイアログが「表示」されません:(

4

4 に答える 4

2

データベースに「I'm busy processing」フラグを設定します。

そして、アプリは起動時にチェックし、適切な方法でアプリをロックし、フラグの状態を確認するために x 秒ごとにチェックする必要があります。通常の処理中にこれを行うことができるため、すべてのアクションは、開始前にローカルおよびサーバーでこのフラグをチェックします。

簡単なロック方法のようです。そのため、おそらくセマフォタイプの配置を使用して、競合 (複数のユーザーの設定と設定解除) を考慮する必要があります。

于 2012-06-05T01:14:52.170 に答える
1

ローカル放送はいいぞ。

サービスがビジーかどうかをアクティビティに質問させ、アクティビティを終了する前にユーザーに適切なメッセージを表示します。

サービスが完了したら、完了したというインテントを送信します。

于 2012-06-05T02:44:17.667 に答える
0

私が見つけた最良の方法は、常に最初にロードし、安全に実行できるときにユーザーをメイン画面に送る「ロード アクティビティ」を作成することでした。

于 2012-06-05T19:52:13.260 に答える
0

サービスでAsyncTaskを使用して、重いデータベース作業を行います。

共有プリファレンスを使用してフラグを保存し、作業が進行中であることを他のアクティビティに通知します。フラグが true の場合は進行中の作業を意味し、フラグが 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 が見つかった場合は、進行状況ダイアログを表示して、ユーザーに待機するように指示できます。

于 2012-06-05T05:50:28.240 に答える