我有这个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();
提前致谢
答案 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;
}
现在,你可以通过执行
来解散setterJSONRequestService service = new JSONRequestService(getApplicationContext());
service.withParameters(Parameters).postRequest();