6

呼び出し元の Activity クラスの内部クラスではない AsyncTask 内から、AsyncTask の実行を開始した Activity のインスタンスへの参照を取得することはまったく可能ですか?

私はこのスレッドを認識していますが、呼び出し元のアクティビティを参照する方法を正確に扱っているわけではありません。Activity への参照をパラメーターとして AsyncTask コンストラクターに渡すことを提案する人もいますが、そうすると常に NullPointerException が発生することが報告されています。

だから、私は途方に暮れています。私の AsyncTask は堅牢な機能を提供しており、それを使用するすべてのアクティビティで内部クラスとして複製する必要はありません。エレガントなソリューションが必要です。

4

2 に答える 2

10

「エレガントな解決策」は、前の質問をした人(次に自分の質問に2回答えた人)が自分のしていることを知っていると仮定するのではなく、実際にパラメーターとして(コンストラクターまたはに)渡して、それが機能するかどうかを確認することです。execute()それに固有のものが悪いコンストラクターパラメーターになるとは考えられずAsyncTaskActivity他のすべてのオブジェクトは問題ありません。

現在、私は常にプライベート内部クラスであるため、Activity(またはその他のContext)をパラメーターとしてに渡していません。実際、あなたが私に公開してほしいという事実はコードの臭いであり、これらのタスクがまたは他のコントロールポイントによって仲介されるべきであることを示唆しています。しかし、それは私だけです。AsyncTaskAsyncTasksAsyncTaskService

アップデート

このパターンを処理するためのより良い答えはここにあります:バックグラウンドタスク、進行状況ダイアログ、向きの変更-100%機能する解決策はありますか?

于 2010-04-27T11:22:37.763 に答える
4

AsyncTaskの は、特定のタイプのActivity. それらはコンストラクターでそのインスタンスを受け入れ、ローカル変数に格納します。関連するものをカプセル化し、他のアクティビティによって拡張される
抽象Activityクラスを作成するという観点から考えてみてください。 そのようです:AsyncTask

public abstract RemoteListActivity<T> extends ListActivity{

// calls AsyncTask, shows spinning progress dialog, etc

protected abstract T someConcreteMethod();

}

public final class CustomerListActivity extends RemoteListActivity<Customer>{

protected final Customer someConcreteMethod();

}

あるいは、物事が単一の階層に収まらない場合は、インターフェースを用意してください。

interface LazyLoadable {
    void setLoadingState();
    void setDefaultState();
}

public class MyActivity extends Activity implements LazyLoadable{
}

public final class AsyncTask extends AsyncTask<Void, Void, Void>{

    private final LazyLoadable lazyLoadable;

    public MyAsyncTask(Context ctx, LazyLoadable lazyLoadable){
        super(ctx);
        this.lazyLoadable = lazyLoadable;
    }

}
于 2010-04-27T15:53:39.277 に答える