2011-02-07 15 views
12

私のアプリケーションでは、私はUI Settingのためのクラスを持っています、その名前は "SettingActivity"です。AsyncTaskがアプリケーションのメインスレッドで実行されるのはなぜですか?

次に、バックグラウンドでいくつかのジョブを実行するために、このUIクラス(SettingActivity)をサービスにバインドします。 このサービスには、.aidlファイルで定義された2つの事前定義メソッドがあり、1つはstartTask()、もう1つはstopTask()です。

startTask()内で、私はAsyncTaskを呼び出しました。しかし、私はこのAsyncTaskのルーパーの名前をチェックした。それは「メイン」です。私の意見では、AsyncTaskは、メインスレッド以外の別のスレッドを開始する必要があります。

誰かがなぜこれが起こるのか知っていますか?

コードは次のとおりです。

@Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     Log.d(TAG, "onPreExecute "+Looper.myLooper().getThread().getName()); 
    } 

Then I will get main as the output.

+1

サンプルコードを投稿すると便利です。 –

答えて

23

An AsyncTask has several parts: a doInBackground実際には別のスレッドで実行されるメソッドと、UIスレッドで実行されるonPostExecuteメソッドです。 onPostExecuteの目的は、UIスレッドで実行する必要がある結果(ビュー階層の更新やテキストビューのテキストの設定など)を公開することです。また、進行状況の更新を通知することもできます。これをすべて正しく動作させるには、AsyncTaskを作成し、UIスレッドでexecuteメソッドを呼び出す必要があります。

doInBackgroundからUIアクションを呼び出さないでください。そうすると、アプリケーションがクラッシュします。 "UIスレッド上で呼び出された"

+0

お返事ありがとうございます。本当に助けてくれました〜 – Mathieu

+0

たとえば、トーストを別のスレッドにしたいのですが、どうすればいいですか? – Behzad

+1

@Behzad - アクティビティへの参照がある場合は、[この回答](http://stackoverflow.com/a/3134720/535871)で説明されているように、 'runOnUiThread'を使うことができます。 –

6

実際に、私はアンドロイドのドキュメントをチェックして、 onPreExecute()、onProgressUpdate(プログレス...)とonPostExecute(結果)が全てです。

doInBackground(Params ...)メソッドは「バックグラウンドスレッドで呼び出されます」のみです。

関連する問題