、私は活動の内部クラスとしてAsyncTaskを定義することができ、これは、2つの欠点を有している、私は問題を見つける:Android AsyncTaskからアクティビティUIを変更するにはどうすればよいですか?私は(AsyncTaskを使用して)別のスレッドから更新されるUIを有するシナリオで
- それはコードそれはそれは難しいスレッドクラス
良い解決策は何を再利用することができ
、私は活動の内部クラスとしてAsyncTaskを定義することができ、これは、2つの欠点を有している、私は問題を見つける:Android AsyncTaskからアクティビティUIを変更するにはどうすればよいですか?私は(AsyncTaskを使用して)別のスレッドから更新されるUIを有するシナリオで
良い解決策は何を再利用することができ
私はちょうどContext
をAsyncTask
のコンストラクタに渡したことが分かりました。
public class BackgroundStuff extends AsyncTask<Void, Void, Void> {
...
Context mContext;
...
BackgroundStuff(Context context){
super();
this.mContext = context;
}
...
}
他の誰かが他の方法を使用しているのであれば、私は興味があります。
AsyncTask
を使用する場合は、doInBackground()
のUIアクティビティを使用しないでください。
あなたができることは次のとおりです。実行中のバックグラウンドジョブのステータスを更新するには、doInBackground()からpublishProgress(values)
になります。 ランタイムはこれらの値に対して、onProgressUpdate(values)
コールバックを呼び出します。これはUIスレッドで実行され、UIを更新できる場所から実行されます。
https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/TweetListActivity.java#L336を参照してください。
AsyncTaskは、独自のクラスファイルに実装できます。
doInBackground()メソッドはUIにアクセスできません。フレームワークは試行すると例外をスローします。しかし、私の質問は、AsyncTaskサブクラスがUIに実際にどのようにアクセスするかに関連しています。 –
@Olliこれは私が言うことです:doInBackgrround()はUIにアクセスしてはいけません。 onPre | PostExecute()の前後に、またはその間に進行状況を公開して、その前後に行います。これらの3つのコールバックメソッドはUIにアクセスすることができます –
私は一般的に通常のスレッドを使用する方が好きだから基本的にはバックグラウンドタスクを実行しUIを更新する方法はonCreate()メソッドの最後にHandlerを作成するので、AsyncTasksで多少奇妙なPOVがあります。 handleMessage(Message msg)メソッドをオーバーライドします。
私のスレッドでは、パラメータとしてハンドラを渡します。更新をしたいときは、スレッドからハンドラにメッセージを送信します。これは新しいものから通信するものですバックグラウンドスレッドをUIスレッドに追加して、UI上の作業を処理します。
私は、AsyncTasksが同様のタスクを実行すると思いますが、ハンドラのhandleMessageメソッドをオーバーライドする必要はありません。
これら2つのアプローチの間の利点/欠点の詳細については、興味深いことがあります。
私は最初Handlerを使用しましたが、私はそれだけでゲル化しませんでしたが、それは完全に主観的な認識です。私はAsyncTaskの明快さが気に入っています。私は通常、内部クラスではなく別のクラスとしてそれらを分割し、それを使って作業し、Activityサブクラスをより管理しやすくします。 –
クラスにコンテキストを渡すことは、私が現在行っていることです。むしろ面倒ですが、もっと良い方法はないかもしれません。 –