【问题标题】:How do you separate a nested method in a constructor to a separate method如何将构造函数中的嵌套方法分离为单独的方法
【发布时间】:2020-01-25 03:27:37
【问题描述】:

这更像是一个风格的东西,一个自学的东西,但是在凌空代码中是监听器,我在网上找到的所有代码都只是在构造函数中嵌套了一个覆盖方法。不一定是我习惯于 C# 背景的东西。实际上 lambda 并不太擅长,匿名方法也不是。

我不知道从哪里开始,因为现在对我来说似乎并不直观。但我想将嵌套方法分离为它们各自的方法。或者甚至可能只是覆盖的方法,如果这是唯一需要的部分。

    final EditText textView = (EditText) findViewById(R.id.editText);

    RequestQueue queue = Volley.newRequestQueue(this);
    String url = "http://myURL";

    JSONObject postparams = new JSONObject();
    postparams.put("city", "london");
    postparams.put("name", "bob");

    // Request a string response from the provided URL.
    JsonObjectRequest  postRequest = new JsonObjectRequest(Request.Method.POST, url, postparams,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    textView.setText("Success: "+ response.toString());
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    textView.setText(String.valueOf(error.networkResponse.statusCode));
                }
            }
    );
    // Add the request to the RequestQueue.
    queue.add(postRequest);

我想要的是在同一个类中的 2 个响应参数中命名一个方法,或者这本身可以进行覆盖。可能吗?类似的东西。

...
JsonObjectRequest  postRequest = new JsonObjectRequest(Request.Method.POST, url, postparams, myResponseListener(JSONObject response), myErrorResponseListener(VolleyError error));
// Add the request to the RequestQueue.
queue.add(postRequest);
}

public void myResponseListener(JSONObject response){
     textView.setText("Success: "+ response.toString());
}
public void myErrorResponseListener(VolleyError error){
    textView.setText(String.valueOf(error.networkResponse.statusCode));
}

这样的事情有简单的方法吗?

编辑:尝试 linucksrox 的答案,令我惊讶的是,以下实际上独立作为自己的方法......没有 public(访问修饰符)或 void(返回类型)??

    Response.Listener<JSONObject> myListener(JSONObject response)
    {
        return new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                textView.setText("Success: "+ response.toString());
            }
        };
    }

但是当我尝试将 myListener 作为第四个参数插入时,它会抱怨这些参数。

myListener() no work, 
myListener(JSONOBject response) no work

错误部分参数也是如此。

【问题讨论】:

  • 你可以让类本身实现监听器接口,或者使用方法引用。
  • 问题是,我不知道该怎么做。如果我能得到关于如何实现接口和方法引用的解释会很酷,但我对示例代码同样满意,然后我可以尝试将其分解并尝试理解。不幸的是,这两个短语现在对我来说只是抽象的词。
  • 你看过网上的例子吗?实现一个接口是非常基础的——它类似于扩展一个类。如果您不理解“扩展课程”,那么您应该深入研究这些术语,因为这些术语适用于许多 语言。在您的情况下,它将是class YourClass implements Response.Listener&lt;JSONObject&gt;, Response.ErrorListener。这样做会强制你的类实现这些方法。从那里,您可以将this 传递到任何需要侦听器的区域:new JsonObjectRequest(..., ..., ..., this, this);。希望这会有所帮助。

标签: java android function methods android-volley


【解决方案1】:

你应该可以做这样的事情:

    Response.Listener<JSONObject> myListener = new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            textView.setText("Success: "+ response.toString());
        }
    };

    Response.ErrorListener myErrorListener = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            textView.setText(String.valueOf(error.networkResponse.statusCode));
        }
    };

    // Request a string response from the provided URL.
    JsonObjectRequest  postRequest = new JsonObjectRequest(Request.Method.POST, url, postparams,
            myListener, myErrorListener);

【讨论】:

  • 评论格式不好,所以我在编辑的 OP 中回复。
  • 我刚刚更正了在 Android Studio 中验证的语法,它可以编译并运行良好。
  • 哇,谢谢!那行得通!我想我现在看到了。 myListener 是一个拥有覆盖方法的对象。所以在方法中我们不是传递一个方法,而是一个 Response.Listener 对象。仍然有点让我头晕目眩。但现在更有意义了。
  • 没错,myListener 是 Listener 的一个实例(实际上是一个接口)。这就是 JSONObjectRequest 方法定义作为参数所要求的。这是一种常见的模式(将接口的实例传递给方法),简而言之,它允许类解耦,因此接收类不需要知道调用类的任何信息。
猜你喜欢
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 2020-12-27
相关资源
最近更新 更多