2012-06-05 6 views
6

私は1日に1回取引の中で幾分かの重労働を起こすバックグラウンドサービスを持っています。この時点でユーザーがアプリを起動した場合は、終了するまで(10秒程度)、彼らはしっかりと座るようにします。すべてのアクティビティでこれを行う最善の方法は何ですか?サービスが各アクティビティの "onResume"機能で実行されているかどうかを確認しますか?それがいつ終わったのか、私たちはどのように知っていますか?ローカル放送私は推測しています...データベースが重い背景作業をしている最中にフリーズしてアプリケーションに最適な方法?

ベストプラクティス誰ですか?

更新:サービスが完了するまで「onResume」をストールすることができました。問題は、ユーザーがそれまで空白の画面しか見ていないことです。私は、onResumeが一時停止している間、progressdialogsと定期的なダイアログを試してみました。しかし、それらはすべてonResumeが返すときにのみ表示され、目的を破ります。言い換えれば、進捗ダイアログが「ショー」と呼ばれてすぐに「)(ショー」の後:(

答えて

1

ローカルブロードキャストが良好です。

サービスがビジーであるかどうか質問し、アクティビティを終了する前に適切なメッセージを表示してください。

サービスが完了したら、完了したという意図を送信します。

+0

サービスが忙しいときにユーザーがアプリを起動すると、画面を終了することに決めました!残念ながら、私がfinish()を呼び出したときには、 "Toast"メッセージは機能していないようです。 –

2

私が持っているでしょうしませんデシベルにフラグ「を私は忙しい処理よ」。

そして、起動時にアプリをチェックして、アプリケーションをうまくロックしてから、x秒ごとにフラグの状態を確認する必要があります。サーバを起動する前に。

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

+0

まだセマフォを勉強していませんが、私はあなたの提案を試みました。私は "onResume"メソッドのwhileループで "thread.sleep"を実行しましたが、画面は空白になりませんでした。 –

+0

あなたはスリープスレッドを呼び起こす方法を読む必要があります –

+0

。唯一の問題は、 "onResume"機能がスリープしている間に、トーストやダイアログメッセージ、または進行状況のダイアログを表示することができます。つまり、onResumeの後に生きていきます。 –

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を見つけた場合は、進行状況ダイアログを表示して、ユーザーに待機させることができます。

+0

私はサービスでタスクを実行しています。したがって、 "onResume"では、実行中かどうかをチェックし、そうでなければ、whileループで数秒間スリープ状態にします。唯一のことは、UIスレッドがスリープしている間に、私はダイアログまたはトーストメッセージを表示できません。 onResumeがどんな種類のミスを終えた後にそれらが現れているように見えます! –

+0

@Bhagwad - 'onResume'で眠らないでください。代わりに、ライフサイクルメソッド( 'onCreate'、' onResume'、 'onPause'など)を、作業が完了したかどうかに応じて、2つの状態のいずれかで動作するように設計します。 –

+0

問題は、データベースがロックされていると、super.onResumeがエラーをスローします。どのような方法でも呼び出さなければならないので、私のデータベースがロックフリーになるまで実行を遅らせることができない限り、私はうんざりです。 –

0

私が見つけた最良の方法は、最初に読み込まれたロードアクティビティを作成して、安全なときにメイン画面にユーザーを送信することでした。

関連する問題