当前位置: 首页 > 知识库问答 >
问题:

安卓/Java:有没有一种方法可以在侦听器触发后调用方法的返回?

赵景曜
2023-03-14

我正在使用Volley从HTTP API获取JSONObject。

我的问题是我想让我的方法等待响应侦听器得到结果,否则我的方法返回的是一个空对象。 
我尝试使用synchronize wait和notify来实现它,但似乎不起作用,activity在isfinished.wait()之后冻结,并且侦听器没有触发。你能告诉我我的代码出了什么问题吗?

public JSONObject query(String url) throws InterruptedException {
    finished=false;
    Req = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            synchronized (isFinished){
                Retour = response;
                finished = true;
                isFinished.notifyAll();
            }
        }
    },
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            synchronized (isFinished){
                Retour = null;
                finished = true;
                isFinished.notifyAll();
            }
        }
    });
    Queue.add(Req);
    synchronized (isFinished) {
        while (!finished) {
            isFinished.wait();
        }
        return Retour;
    }
}

共有1个答案

红朝
2023-03-14

我通过更改设计解决了这个问题,因此该方法不会返回任何东西,而是回调一个使用者接口,然后将结果检索到类字段数据中:

Consumer<JSONObject> cons = a -> Data=a;

原来的代码变成了:

public void query(String url,Consumer<JSONObject> cons) {
    Req = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            Retour = response;
            callb.accept(Retour);
        }
    },
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Retour = null;
            callb.accept(null);
        }
    });
    Queue.add(Req);
}
 类似资料:
  • 问题内容: 嗨,我想使用WMI类来查找应用程序和产品信息。但是问题是我想使用Java或任何脚本语言(如python,javascript或perl)。我听说过JWMI,这可能是一个选择。有人可以帮我吗??? 问题答案: JavaScript和Java不是一回事。 JavaScript Windows脚本宿主(WSH)下提供了JavaScript。有了它,访问WMI相当容易: jWMI(Java)

  • 问题内容: 我正在编写小型且非常干燥的框架,该框架高度依赖元数据。我想知道是否有一种方法来获取方法参数名称,即给定一些方法 得到的字符串和。 我知道我可以注释参数,但是那不是很好。 问题答案: 我们为包含参数名称的String[]的方法创建了一个自定义注释。与必须注释每个单独的参数相比,此方法感觉易于管理。我们计划添加构建时检查,以确保带注释的参数名称的数量与参数的数量匹配,因为这是我们所需要的。

  • 问题内容: 我有Visio2007,我真的很喜欢。但是,它似乎没有Java的UML模型/数据类型。我可以为Java下载一些模板吗?还是我应该完全忘记Visio并获得一个Elipse插件? 谢谢! 问题答案: 后者是更好的选择,恕我直言。此外,我认为UML模型不应该特定于Java。我不知道周围是否有特定于Java的UML。 我在网上搜索时发现了这个。UML模型:MS Visio 2007。

  • 我们可以使用这些jvm标志来确定编译阈值,但是有没有一种方法可以在运行时以编程方式确定它?

  • 我试图使用bytebuddy返回一些字段作为列表。我打电话给数组。asList()使用MethodCall,但无法处理可变长度参数。还有其他方法吗? 错误: 线程“main”java中出现异常。lang.ExceptionInInitializerError由以下原因引起:java。IllegalStateException:公共静态java。util。列出java。util。数组。asList(

  • 问题内容: doIt函数将打印“ dad”。有没有办法让它打印“儿子”? 问题答案: 是。但是就变量而言,它会被覆盖(将新值赋予变量。将新定义赋予函数是Override)。 在父类的块中使用时,该值将得到反映 如果变量是静态的,则在初始化时使用静态块更改其值, 否则更改构造函数。 你还可以稍后在任何块中更改该值。它将反映在超一流