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

时间:2016-08-21 16:27:05

标签: java android

我有这个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方法中,有一个名为jsonObjectRequest的CustomRequest类的对象,我想从onResponse方法返回JSONObject响应变量到父postRequest方法,我得到一个错误:

return response;

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

我打算将我的课程用作以下内容:

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

提前致谢

1 个答案:

答案 0 :(得分:1)

  

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

是的,这是大多数回调的定义方式。通常无需返回,而是根据结果进行操作。

  

我想将onResponse方法中的JSONObject响应变量返回到父postRequest方法

同样,如果您重组呼叫,则无需返回任何内容。另外,方法结束时没有返回语句,因此您的代码开始时并不完全正确。

使用Volley为您的优势并传递其Listener对象,以便&#34;返回事物&#34;。

Sidenote 这不是/不应该是一个Activity类。如果您需要Context,请创建一个构造函数。

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

现在,正如您所看到的,这种方法与直接制作Volley请求之间没有多大区别。您所做的就是公开参数并隐藏另一个类后面的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();