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

我有两个方法在彼此内部,如何从内部方法返回到父级

程阳平
2023-03-14

我有一个CustomRequest类:

public class CustomRequest extends Request<JSONObject>{

private Listener<JSONObject> listener;
private Map<String, String> params;

public CustomRequest(String url, Map<String, String> params,
                     Listener<JSONObject> reponseListener, ErrorListener errorListener) {
    super(Method.GET, url, errorListener);
    this.listener = reponseListener;
    this.params = params;
}

public CustomRequest(int method, String url, Map<String, String> params,
                     Listener<JSONObject> reponseListener, ErrorListener errorListener) {
    super(method, url, errorListener);
    this.listener = reponseListener;
    this.params = params;
}

@Override
protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {
    return params;
};

@Override
protected void deliverResponse(JSONObject response) {
    listener.onResponse(response);
}

@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
    try {
        String jsonString = new String(response.data,
                HttpHeaderParser.parseCharset(response.headers));
        return Response.success(new JSONObject(jsonString),
                HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JSONException je) {
        return Response.error(new ParseError(je));
    }
}

}

然后我有我的类JSONRequest:

public class JSONRequest extends AppCompatActivity{
public String url = "http://192.168.1.101/apps/clients/service.php";
public Map<String, String> requestParameters;

public void setParameters(Map<String, String> Parameters) {
    this.requestParameters = Parameters;
}

public JSONObject postRequest() {
    CustomRequest jsonObjectRequest = new CustomRequest(Request.Method.GET, this.url, this.requestParameters, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                return response;
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("Error", error.getMessage());
        }
    });
    jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 1, 1.0f));

    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
    boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();

    if (isConnected) {
        AppController.getInstance().addToRequestQueue(jsonObjectRequest);
    } else {
        Toast.makeText(getApplicationContext(), "You need internet connection to perform this", Toast.LENGTH_LONG).show();
    }
}

}

我想做的是在我的postRequest方法中,有一个CustomRequest类的对象叫做JSONObject Request,我想将JSONObject响应变量从onResponse方法返回给父postRequest方法,我在以下位置得到一个错误:

return response;

因为它告诉我方法的返回类型是void,请告诉我我做错了什么,正确的方法是什么。

我想使用我的类如下:

JSONRequest request = new JSONRequest();
    request.setParameters(Parameters);
    JSONObject result = request.postRequest();

提前谢谢

共有1个答案

明越
2023-03-14

它告诉我方法的返回类型是void,

是的,大多数回调都是这样定义的。通常不需要返回,而是根据结果行事。

我想将JSONObject响应变量从onACK方法返回到父postRequest方法

同样,如果你重组通话,就没有必要返回任何信息。此外,在方法的末尾没有返回语句,因此您的代码开始时并不完全正确。

利用凌空抽射的优势,绕过听者的物体,以便“回击”。

旁注:这不是/不应该是一个活动类。如果需要上下文,请创建构造函数。

public class JSONRequestService {

    private final Context mContext;  // TODO: Make constructor 

    final Response.ErrorListener errorListener = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("Error", error.getMessage());
        };

    // passthough a callback instead of returning 
    public void postRequest(Response.Listener<JSONObject> listener) {
        CustomRequest jsonObjectRequest = new CustomRequest(Request.Method.GET, this.url, requestParameters, listener, errorListener);

        // TODO: Add to request queue 

    } 
} 

然后,使用

JSONRequestService service = new JSONRequestService(getApplicationContext());
service.setParameters(Parameters);
service.postRequest(new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        try {
            //  response is now available where you want 
        } catch (JSONException e) {
            e.printStackTrace();
        }
    });

现在,正如你所看到的,这种方法和直接发出截击请求没有太大区别。您所做的只是公开参数,并将URL、RequestQueue和错误侦听器隐藏在另一个类后面。

我甚至可能建议对参数使用Builder Pattern方法,因为每个请求肯定使用不同的参数。

public JSONRequestService withParameters(Map<String, String> Parameters) {
    this.requestParameters = Parameters;
    return this;
}

现在,你可以用执行来折叠setter

JSONRequestService service = new JSONRequestService(getApplicationContext());

service.withParameters(Parameters).postRequest();
 类似资料:
  • 我创建了一个接口,以便可以在对话和片段之间进行通信。 目标:当用户从对话框中选择任何内容时,应将其显示在文本视图中。 在这个界面中,我创建了一个界面方法,在主活动中调用,并传递用户在对话框中选择的值。与用户选择的值一起,在我的片段中,我创建了一个方法,将文本视图设置为该值。然而,每当我调用该方法时,它总是返回null。 我对日志进行了大量测试,发现通过我的方法传递的值不是空的,一切似乎都按照我想要

  • 我正在尝试创建REST api,以使用Firebase Server SDK和Jersey执行写入操作。 以下是我要做的: 初始化Firebase SDK 从客户端获取idToken并验证idToken 在少数Firebase节点上执行一些写入操作 发送api响应 我只想在Firebase写入操作成功或失败时返回Response。这发生在Firebase Listeners内部。然而,我尝试从侦听

  • 问题内容: 我正在尝试装饰类中的方法,但是python抛出错误。我的课看起来像这样: : Python抛出以下错误 我要去哪里玩? 问题答案: Python自动将类实例作为参考传递。(在所有类方法中都可以看到的参数)。 您可以这样做:

  • 问题内容: 我的代码在这里: 现在,我想在单击“确认”按钮后返回true。因此,如何从内部类-方法的OnClickListener返回“ true”。 需要一些帮助,谢谢。 问题答案: 在这种情况下,您不能从内部类返回任何东西。在这种情况下,这没有多大意义。该程序是否应该在您的onClick函数中等待,直到它返回某些内容?收听者的工作方式并非如此。您需要做的就是获取计划返回的代码,如果返回“ tr

  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除

  • 如何验证是否调用了。我甚至不能设置mock对象,因为一旦我调用该方法,它就会实例化为null并创建新对象。 我尝试使用