我正在使用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) {
}
答案 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
})
(这种语法肯定是错误的 - 视为伪代码!)