0

AsyncTask クラスを Activity または Fragments から分離するアプリ コードを整理しようとしています。このフォーラムをサーフィンして、「インターフェースとリスナー」ソリューションについて学びました。

インターフェイス.java

public interface TaskCompleteListener<T> {
    public void onTaskComplete(T result);
}

AsyncTask.java

[...]
@Override
protected void onPostExecute(String JSONResponse) {
    // using Gson library I convert JSONResponse string to POJO objects...
    listener.onTaskComplete(result);
}

アクティビティ.java

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    // start AsyncTask...
    }

    // Inner class implementing interface
    public class LoadTaskCompleteListener implements TaskCompleteListener<Object> {
        @Override
        public void onTaskComplete(Object result) {
            updateUI(result);
        }
    }

    public void updateUI(Object result) {
    // here you can manage UI updating, using result object
    }
}

UPDATE DataHelper.java

public class DataHelper {

    private AsyncTaskCompleteListener<Object> listener;

    public DataHelper(AsyncTaskCompleteListener<Obejct> listener) {
        this.listener = listener;
    }

    // Multiple AsyncTask are defined here...
}

このパターンはとても気に入っていますが、アクティビティ (またはフラグメント) 内に複数の request があり、結果の型 (単一オブジェクト、配列、リスト) が異なり、それらを管理するためのビジネス ロジックが異なる場合はどうでしょうか。 単一の callback を使用してそれを処理することはできません。何か案は?インターフェイス内に複数のコールバックを追加する必要がありますか? 私は本当にこれで立ち往生しています。内部に複数の AsyncTask (Web ゲッターのようなもの) を含む DataHelper という単一のファイルがあります。当然、他の代替案を提案していただければ、このアプローチをあきらめることができます。

4

3 に答える 3

1

結果としてオブジェクトの配列を返さないのはなぜですか? 次に、その配列内に複数のオブジェクトがある場合、それらを配置する順序がわかるため、一度に複数の結果セットを使用できます。

public interface TaskCompleteListener<T> {
    public void onTaskComplete(T... results);
}
于 2013-09-15T10:18:58.527 に答える
1

非同期タスクの代わりに「ハンドラー」を使用できること、および各ハンドラーがそのメッセージをメッセージ ルーパーに返し、メッセージが異なるデータをラップすることに注意してください。単なるメッセージ コンポーネントであるため、多くのデータ型を簡単に処理できます。サンプルはこちら

結果コンポーネントを含むメッセージがサンプル コードによって送信される「process_entity()」を参照してください。

于 2013-09-15T10:38:03.690 に答える