Retrofit2:在recyclelerview中执行下一个任务之前等待响应

时间:2017-06-21 15:38:39

标签: android-recyclerview retrofit

我正在使用recyclerview来显示项目列表(图像和文本),我从后端获取Recyclerview列表中显示的项目,我正在使用retrofit2进行休息呼叫,我可以从其余部分获取列表和recyclerview完美呈现。

在recyclerview中显示项目列表时,我想将位图图像添加到项目中的图像。在将此位图图像添加到项目中的图像之前,我必须进行第二次改装调用(异步)以检查该项目是否需要位图图像,如果响应为真,则只需要添加位图图像。

现在的问题是,因为我在改造中进行异步调用(使用入队方法),回收器视图不等待改造的响应,因为它无法在每个图像上的图像上绘制位图项目

我知道我们可以使用同步调用解决问题,但我不想在性能上妥协。

以下是供参考的代码段。

我从recyclerview适配器调用retrofit方法,它将返回基于返回值的布尔值我想在项目图像上绘制位图

改造方法:

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) {

        }

1 个答案:

答案 0 :(得分: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);

完整示例如下所示:

//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
   }
}

Java专家(我不是其中之一)可能能够通过使用匿名函数或lambda表达式的示例来增强此答案。将匿名函数传递给getTestWithUrl可以节省必须提供单独的回调函数,并可以使这种模式更具可移植性。它可能看起来像......

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

(这种语法肯定是错误的 - 视为伪代码!)