1

主な活動にたくさんのボタンがあります。各ボタンはこれと同じように実行さAsyncTaskれ、HTTP POSTメソッドを実行しますが、異なる値を投稿します(これはButton.Tagプロパティに格納します)。だから私はAsyncTaskすべてのボタンに1つ持っています。問題は、AsyncTask彼の仕事が終わったときに、コールバックでどのボタンを更新する必要があるかを知っている必要があることです(実行するボタンAsyncTask)。オブジェクト(ボタンインスタンス)を渡したくないAsyncTaskのは、多くの状況(方向の変更など)でシステムによってアクティビティを再作成できることを読んだため、渡されたオブジェクトAsyncTaskが無効になる可能性があるためです。しかし、View.ID財産はどうですか?アクティビティライフサイクルのシステムによっても変更できますか、この整数値を使用して、このIDでこのボタンAsyncTaskを見つけて渡すことができますか(呼び出し)?onPostExecutefindViewByID

よろしく

4

5 に答える 5

2

要素の id は、R.java で Android によって生成されるため、変更できません。したがって、この値を使用できると思います。

于 2012-06-26T14:06:44.363 に答える
1

簡単なアイデアは、特定のボタンを識別する一意の値を渡すことです。たとえば、button1がクリックされた場合は、「button1」を非同期タスクに渡します。実行後、スイッチケースを使用して目的のボタンを更新できます。

編集:すでにasynctaskにタグ値を送信しているため、findViewWithTagメソッドを使用してボタンを識別することをお勧めします。この場合、スイッチケースを使用する必要はありません。

于 2012-06-26T14:15:54.870 に答える
1

Activity が消えたときに null にできる AsyncTask 内にオブザーバーが必要です。

アクティビティ:

private List<MyAsyncTask> mMyAsyncTasks;

private void addAsyncTask(MyAsyncTask task) {
    mMyAsyncTasks.add(task);
}

public void onDestroy() {
    for(MyAsyncTask task : mMyAsyncTasks) {
        task.removeObserver();
    }
}

非同期タスク:

public class MyAsyncTask extends AsyncTask<Something, Something, Something> {
    private MyAsyncTaskObserver mObserver;
    private int mButtonId;

    public MyAsyncTask(MyAsyncTaskObserver observer, int buttonId) {
        mObserver = observer;
        mButtonId = buttonId;
    }

    public void removeObserver() {
        mObserver = null;
    }

    public void onPostExecute(Something result) {
        ...
        if (mObserver != null) {
            mObserver.onMyDataAvailable(result, mButtonId);
        }
    }
}

また、Activity が破棄されるとメモリ リークが発生する可能性があるため、AsyncTask を Activity 内に配置しないでください。

于 2012-06-26T14:10:27.423 に答える
0

はい、XML で作成されているかコードで作成されているかに関係なく、すべてのビューに一意の識別子があることを確認findViewById(int id)し、AsyncTask が完了した後に ViewGroup を呼び出して正しいビューを取得する場合 ( onPostExecute()AsyncTask でオーバーライドして、UI スレッドにいることを確認します)。

編集:これは、フラグメント/アクティビティで AsyncTask を作成し、それを呼び出しgetView()て階層を取得できることを前提としています。

于 2012-06-26T14:05:18.873 に答える
0

アクティビティ内に非同期タスクを内部クラスとして持つ場合は、 を呼び出して OnPostExecute で整数の id 値を使用できますfindViewById(int id)

それ以外の場合は、ボタンを保持している viewGroup を渡します。

于 2012-06-26T14:07:24.033 に答える