2017-06-21 12 views
2

私はrecyclerviewを使ってアイテム(イメージとテキスト)のリストを表示しています。私はrecyclerviewリストに表示されているアイテムをバックエンドから取り出しています。私は残りのリストを取得することができ、recyclerviewは完全にうまくレンダリングされます。Retrofit2:recyclerviewの次のタスクを実行する前に応答を待つ

私はrecyclerviewにアイテムのリストを表示していますが、アイテムにあるイメージにビットマップイメージを追加します。このビットマップイメージをアイテムに存在するイメージに追加する前に、ビットマップイメージがそのアイテムに必要かどうかをチェックするために2回目の呼び出し(非同期)を行う必要があります。

私は非同期呼び出し(エンキューメソッドを使用して)をレトロフィットで行っているため、リサイクルビューはリビジョンの応答を待っているわけではないため、ビットマップをイメージに描画できないためです。各項目。

私は同期呼び出しを使用して問題を解決できることは知っていますが、パフォーマンスを妥協したくありません。

以下は参考用のコードです。

I返された値に基づいてブール値を返しますrecyclerviewアダプタからのコール改造方法だ私は、アイテムの画像に

レトロフィット法ビットマップを描画したい:私はあなたがしたいと思います

HttpRestServiceConsumer.getBaseApiInterface(false) 
    .getTestWithURL(imageURL) 
    .enqueue(new Callback<TestResponse>() { 

     @Override 
     public void onResponse(Call<TestResponse> call, Response<TestResponse> response) { 

      try { 
       if (response.isSuccessful()) { 

        data = response.body().getTrackElements(); 

        if (response.body().getTrackElements().size() > 0) 

          testExist = true; 

        else 

        testExist=false; 


      } catch (Exception e) { 

      } 

     } 

     @Override 
     public void onFailure(Call<TestResponse> call, Throwable t) { 

     } 

答えて

2

を呼び出しのクラスに登録するための存在のテストを取得します。 一つこれを行う方法は、インターフェイスを宣言することです...

public interface GetTestWithURLCompletion { 
    public void getTestWithURLCompletion(boolean success); 
} 

あなたの呼び出し元のクラスは、このインタフェースを採用すべき...

public class CustomClass implements GetTestWithURLCompletion { 

    public void getTestWithURLCompletion(boolean success) { 
     if (success) // do something 
    } 
} 

とURL機能は、パラメータとして、発信者を受け入れるべき:

public void getTestWithURL(String imageURL, GetVeepWithURLCallback caller); 

呼び出し元のクラスはgetTestWithURLへの呼び出しの一環として、自分自身への参照を送信します。

webServiceManager.getTestWithURL(imageURL, this); 

その後getTestWithURLは、呼び出し元のクラスのインタフェースを起動するために戻って呼び出すことができます。

caller.getTestWithURLCompletion(testExist); 

完全な例は次のようになります。Javaで

//interface 
public interface GetTestWithURLCompletion { 
    public void getTestWithURLCompletion(boolean success); 
} 

//api access class 
public class ApiManager { 

    //getTestWithURL 
    public void getTestWithURL(String imageURL, GetVeepWithURLCallback caller) { 

    HttpRestServiceConsumer.getBaseApiInterface(false) 
    .getTestWithURL(imageURL) 
    .enqueue(new Callback<TestResponse>() { 

     @Override 
     public void onResponse(Call<TestResponse> call, Response<TestResponse> response) { 

      try { 
       if (response.isSuccessful()) { 

        data = response.body().getTrackElements(); 

        if (response.body().getTrackElements().size() > 0) { 
         caller.getTestWithURLCallback(true); 
        } else { 
         caller. getTestWithURLCallback(false); 
        } 
      } catch (Exception e) { 

      } 
     } 
     @Override 
     public void onFailure(Call<TestResponse> call, Throwable t) { 
     } 
    } 
} 


//calling class 
public class CustomClass implements GetTestWithURLCompletion { 

    //calling function 
    public void someFunction { 
     apiManager.getTestWithURL(imageURL, this) 
    } 

    //callback function 
    public void getTestWithURLCompletion(boolean success) { 
     if (success) // do something 
    } 
} 

専門家(私は一つではありませんよ匿名関数やラムダ式を使った例を使ってこの答えを高めることができるかもしれません。匿名関数をgetTestWithUrlに渡すと、別のコールバック関数を提供する必要がなくなり、このパターンを移植性の高いものにすることができます。それは

apiManager.getTestWithUURL(imageURL,(boolean success) -> { 
      if (success) // do something 
}) 

は(この構文は間違いなく間違っている - 擬似コードとして扱う!)...のように見えるかもしれません

関連する問題