我正在尝试返回我从调用请求中的onResponse
方法获取的值,retrofit
有没有一种方法可以使我从重写的方法中获取该值?这是我的代码:
public JSONArray RequestGR(LatLng start, LatLng end)
{
final JSONArray jsonArray_GR;
EndpointInterface loginService = ServiceAuthGenerator.createService(EndpointInterface.class);
Call<GR> call = loginService.getroutedriver();
call.enqueue(new Callback<GR>() {
@Override
public void onResponse(Response<GR> response , Retrofit retrofit)
{
jsonArray_GR = response.body().getRoutes();
//i need to return this jsonArray_GR in my RequestGR method
}
@Override
public void onFailure(Throwable t) {
}
});
return jsonArray_GR;
}
我无法获取值,jsonArray_GR
因为要能够在onResponse
方法中使用它,我需要将其声明为final,而我无法给它赋值。
问题是您试图同步返回的值enqueue
,但是它是使用回调的异步方法,因此您无法做到这一点。您有2个选择:
RequestGR
方法以接受回调,然后将enqueue
回调链接到该方法。这类似于在rxJava之类的框架中进行映射。大致如下所示:
public void RequestGR(LatLng start, LatLng end, final Callback<JSONArray> arrayCallback)
{
EndpointInterface loginService = ServiceAuthGenerator.createService(EndpointInterface.class);
Call<GR> call = loginService.getroutedriver();
call.enqueue(new Callback<GR>() {
@Override
public void onResponse(Response<GR> response , Retrofit retrofit)
{
JSONArray jsonArray_GR = response.body().getRoutes();
arrayCallback.onResponse(jsonArray_GR);
}
@Override
public void onFailure(Throwable t) {
// error handling? arrayCallback.onFailure(t)?
}
});
}
这种方法的警告是,它只会将异步内容推上一个新的台阶,这可能对您来说是个问题。
BlockingQueue
,Promise
或Observable
甚至您自己的容器对象(请注意确保线程安全)的对象,该对象可以检查和设置值。看起来像:
public BlockingQueue<JSONArray> RequestGR(LatLng start, LatLng end)
{
// You can create a final container object outside of your callback and then pass in your value to it from inside the callback.
final BlockingQueue<JSONArray> blockingQueue = new ArrayBlockingQueue<>(1);
EndpointInterface loginService = ServiceAuthGenerator.createService(EndpointInterface.class);
Call<GR> call = loginService.getroutedriver();
call.enqueue(new Callback<GR>() {
@Override
public void onResponse(Response<GR> response , Retrofit retrofit)
{
JSONArray jsonArray_GR = response.body().getRoutes();
blockingQueue.add(jsonArray_GR);
}
@Override
public void onFailure(Throwable t) {
}
});
return blockingQueue;
}
然后,您可以像这样在调用方法中同步等待结果:
BlockingQueue<JSONArray> result = RequestGR(42,42);
JSONArray value = result.take(); // this will block your thread
我强烈建议您阅读类似rxJava的框架。
我正在尝试在注册用户后从改装API获得响应。 我从函数 注册URL:https://apitest10101.000webhostapp.com/alaa-apii/public/createuser(方法桩) API返回单个对象JSON,如 注册Activity.java 如果我删除中的if语句,我在日志中得到了这个错误 结果模型。Java语言 改装客户端。Java语言 API接口 建造Grad
问题内容: 这个问题已经在这里有了答案 : java“ void”和“ non void”构造函数 (4个答案) 10个月前关闭。 问题答案: 您定义的实际上不是构造函数,而是称为的方法。如果您将代码更改为如下所示,则可以正常运行: 如果未明确定义任何特定的构造函数,则编译器会自动创建一个无参数的构造函数。
我正在尝试从函数返回布尔值。 错误:布尔文字不符合预期的类型单位。 我知道unit是kotlin中的默认返回类型。我将如何将其更改为布尔值。
问题内容: 我正在使用凌空特技从REST api解析电影详细信息,并将解析后的数据保存在一个名为detailsMovies的对象的Arraylist中。但是我无法在onResponse方法之外访问ArrayList。我是Android新手,所以我不知道该怎么做。任何帮助表示赞赏! 这是代码: 问题答案: 在您的课程中定义一个接口并实现它。 因此,这里的简单技巧是与回调接口。
本文向大家介绍PHP 如何从函数返回两个值,包括了PHP 如何从函数返回两个值的使用技巧和注意事项,需要的朋友参考一下 无法明确返回两个变量,可以将它们放入列表/数组数据结构中并返回。 示例 输出结果 这将产生以下输出-
问题内容: 在SO中多次问过这个问题。但是我还是收不到东西。 我想从回调中获得一些价值。请看下面的脚本进行澄清。 如果我尝试返回该值,则只是“未定义”。我遵循了SO的一些想法,但仍然失败。 那些是: 问题答案: 这是不可能的,因为您无法从同步方法内部的异步调用返回。 在这种情况下,您需要将回调传递给foo,该回调将接收返回值 问题是,如果内部函数调用是异步的,则所有“包装”此调用的函数也必须是异步