0

私のフランス語英語を許してください!

そのため、Android コードに問題があります...カスタム オブジェクトの arrayList を返すメソッドを呼び出します...しかし、この arrayList は非同期的に読み込まれ、リスナーに返されます。

リスナーのメソッドが呼び出されたときにデータを返す方法を知っていますか?

ここに私のコード:

    public static ArrayList<Advert> getAdverts(Context context) {
    // Initialize
    RestHelper restHelper = new RestHelper();

    // Set the listener
    restHelper.setOnRestListener(new OnRestListener<Advert>() {
        @Override
        public void onDataAvailable(ArrayList<Advert> result) {
            // -- Datas are loaded : now we must return them ! --
        }
    });

    // Launch the async query
    restHelper.getRemoteAdverts();
    }

ありがとう !!

4

2 に答える 2

0

問題についてはよくわかりません。呼び出すことができる非同期メソッドがありますが、非同期メソッドであるため結果を返すことができないため、2つの解決策があります:-すべてのデータが利用可能になるまでメソッドを待ちますが、非同期の利点は失われます。-Oberserver/Observableパターンを実装します。

最初のオプションについては、RestHelperを調べてください。おそらく、すでに解決策があります。2番目のオプションの例:

public static void requestAdverts(Context context) {
RestHelper restHelper = new RestHelper();
final AdvertListener thisInstance = this;
restHelper.setOnRestListener(new OnRestListener<Advert>() {
    @Override
    public void onDataAvailable(ArrayList<Advert> result) {
        thisInstance.notifyDataLoaded(result);
    }
});
// Launch the async query
restHelper.getRemoteAdverts();

インターフェイスを作成します:

interface AdvertListener { 
    notifyDataLoaded(ArrayList<Advert> result);
}

そして最後に、メインクラス(requestAdvertsメソッドを呼び出すクラス)に新しいインターフェイスを実装させます。

于 2013-01-29T18:58:20.603 に答える
0

関数の設計を見直してください。同期関数 (getAdverts) 内で非同期にロードするのは面倒です。関数が同期の場合は、リストを同期的にロードして戻ります。

何らかの理由で現在のアプローチを進めたい場合は、setOnRestListener の後に呼び出し元をブロックし、コールバック (onDataAvailable) を取得したらロックを解除してリストを返します。

これには ConditionVariable を使用できます。

呼び出し元をブロックします: ConditionVariable.block (); ConditionVariable.close ();

呼び出し元のブロックを解除/開く: ConditionVariable.open (); お役に立てれば。

于 2013-01-29T19:11:48.240 に答える