-2

私は非常に厄介な問題に直面しています。数十秒かかる実行コードがあります。最後に、その計算の結果を取得する必要があります。

コードをメイン スレッドだけで実行すると、スレッドがブロックされていることを通知し、強制的にブロックするかどうかを尋ねる Android がポップアップ表示されます。

原則は正常です。すべての OS カーネルは、コードがまだ生きていてブロックされていないことを知る必要があります。

だから私の質問は、私たちが死んでいないことを Android に通知する方法ですか? たとえば、Sleep(0) や ProcessMessage() などに相当します...しかし、それは Android に、私たちが死んでいないことを通知します。なぜなら、私たちはかなり長い間何かを待っているか実行しているだけだからです...

問題はまったく同じであるため、「別のスレッドで計算を行ってください」と答えないでください。メイン スレッドは、スレッドがいつ完了し、その結果が得られるかを知るために、まだ座っている必要があります。

4

3 に答える 3

6

データベースやインターネットにアクセスするプロセス、または UI スレッドで 0.2 秒以上かかるプロセスを実行しないでください。

Asynctask は非常に強力な方法であり、事前に決められた時点で UI を更新しながら、計算をスレッド化できます。それを愛することを学びましょう。

ユーザーに知らせる限り、実行前ブロックにスピナーダイアログを表示し、実行後ブロックに表示しないようにします。

編集: これを少し掘り下げるには: asynctask には、UI スレッド onPreExecute、onPostExecute、および onProgressUpdate) で実行される 3 つのブロックがあります。これらのブロックでは、UI を更新できます。doInBackground ブロック内では独自のスレッドであるため、処理中に UI をブロックしません。

実際には、onPreExecute でプロセスが発生していることを通知し、onProgressUpdate 中に進行状況をユーザーに通知し、onPostExecute ブロック中に最終的な情報を表示する/お待ちくださいダイアログをクリアするように設定できます。あなたが議論している正確な問題に取り組むために特別に設計されました。

UI スレッドで実行することによって 4 秒を超えてシステムをロックアップするプロセスは、応答しないエラーをユーザーに表示します。

http://developer.android.com/reference/android/os/AsyncTask.html

于 2013-01-23T18:44:21.763 に答える
1

私はおそらくこれの欠点を見つけるでしょうが、実際には、適切な場合にのみAsyncTaskを使用してください!(読んでください:やめてください!)

ここでのVirgilDobjanschiの答え:

http://www.youtube.com/watch?v=xHXn3Kg2IQE

..本当に、本当に良いです。それはもう少し複雑ですが、実際の問題ほど複雑ではないことがよくあります。

元の質問には多くの詳細はありませんが、問題を解決するための最良の方法(すべての回答が同意するように)別のスレッドを使用することである可能性があります。ただし、他のスレッドに到達するための最良の方法は、IntentServiceで起動されるインテントである可能性があります。...次に、runOnUiThreadまたはHandlerを実行して、応答を返します。

于 2013-01-23T19:42:33.770 に答える
1

別のスレッドで計算してから、 http://developer.android.com/reference/android/app/Activity.html#runOnUiThread (java.lang.Runnable )を使用して UI スレッドにコールバックする必要があります。

詳細については、 http://developer.android.com/guide/components/processes-and-threads.htmlを参照してください。

于 2013-01-23T18:45:15.630 に答える