gpt4 book ai didi

android-recyclerview - 改造 2 : wait for response before executing next task in recyclerview

转载 作者:行者123 更新时间:2023-12-04 03:11:47 25 4
gpt4 key购买 nike

我正在使用 recyclerview 显示项目列表(图像和文本),我正在从后端获取 recyclerview 列表中显示的项目,我正在使用 retrofit2 进行休息调用,我能够从其余部分获取列表并且 recyclerview 呈现得非常好。

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

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

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

以下是供引用的代码片段。

我正在从 recyclerview 适配器调用 retrofit 方法,它将根据返回值返回 bool 值我想在项目图像上绘制位图

改造方法:

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

}

最佳答案

我想你想获得存在性测试以在调用类中注册。 一种方法是声明一个接口(interface)...

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

你的调用类应该采用这个接口(interface)...

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可以回调调用调用类中的接口(interface):

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

(这个语法绝对是错误的——当作伪代码!)

关于android-recyclerview - 改造 2 : wait for response before executing next task in recyclerview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44680586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com