2011-01-29 4 views
9

、私は活動の内部クラスとしてAsyncTaskを定義することができ、これは、2つの欠点を有している、私は問題を見つける:Android AsyncTaskからアクティビティUIを変更するにはどうすればよいですか?私は(AsyncTaskを使用して)別のスレッドから更新されるUIを有するシナリオで

  1. それはコードそれはそれは難しいスレッドクラス

良い解決策は何を再利用することができ

  • を管理して効率を低下させること、ソースファイルが非常に大きいのですか?内部クラスを使用しますが、すべてのクラスを他のクラスに抽象化しますか? Activityへの参照をAsyncTaskに渡しますか?常にAsyncTaskクラスを内部クラスとして定義し、ソースファイルを受け入れるだけで大​​規模になりますか?

  • 答えて

    2

    私はちょうどContextAsyncTaskのコンストラクタに渡したことが分かりました。

    public class BackgroundStuff extends AsyncTask<Void, Void, Void> { 
        ... 
        Context mContext; 
        ... 
        BackgroundStuff(Context context){ 
         super(); 
         this.mContext = context; 
        } 
        ... 
    } 
    

    他の誰かが他の方法を使用しているのであれば、私は興味があります。

    +0

    クラスにコンテキストを渡すことは、私が現在行っていることです。むしろ面倒ですが、もっと良い方法はないかもしれません。 –

    13

    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は、独自のクラスファイルに実装できます。

    +0

    doInBackground()メソッドはUIにアクセスできません。フレームワークは試行すると例外をスローします。しかし、私の質問は、AsyncTaskサブクラスがUIに実際にどのようにアクセスするかに関連しています。 –

    +0

    @Olliこれは私が言うことです:doInBackgrround()はUIにアクセスしてはいけません。 onPre | PostExecute()の前後に、またはその間に進行状況を公開して、その前後に行います。これらの3つのコールバックメソッドはUIにアクセスすることができます –

    0

    私は一般的に通常のスレッドを使用する方が好きだから基本的にはバックグラウンドタスクを実行しUIを更新する方法はonCreate()メソッドの最後にHandlerを作成するので、AsyncTasksで多少奇妙なPOVがあります。 handleMessage(Message msg)メソッドをオーバーライドします。

    私のスレッドでは、パラメータとしてハンドラを渡します。更新をしたいときは、スレッドからハンドラにメッセージを送信します。これは新しいものから通信するものですバックグラウンドスレッドをUIスレッドに追加して、UI上の作業を処理します。

    私は、AsyncTasksが同様のタスクを実行すると思いますが、ハンドラのhandleMessageメソッドをオーバーライドする必要はありません。

    これら2つのアプローチの間の利点/欠点の詳細については、興味深いことがあります。

    +0

    私は最初Handlerを使用しましたが、私はそれだけでゲル化しませんでしたが、それは完全に主観的な認識です。私はAsyncTaskの明快さが気に入っています。私は通常、内部クラスではなく別のクラスとしてそれらを分割し、それを使って作業し、Activityサブクラスをより管理しやすくします。 –

    関連する問題