2016-08-21 43 views
0

返回上级我有这个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方法中,有一个CustomReques对象所谓jsonObjectRequest,我想从onResponse方法父postRequest方法返回的JSONObject响应变量t类,我得到一个错误的位置:

return response; 

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

我假设用我的类,如下所示:

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

在此先感谢

回答

1

it tells me that the method's return type is void,

是的,这是最回调是如何定义的。通常不需要返回,而是根据结果采取行动。

I want to return the JSONObject response variable from the onResponse method to the parent postRequest method

同样,如果您重新调用通话,则不需要返回任何内容。另外,在该方法结束时没有返回语句,因此您的代码不是完全正确的。

使用Volley为您提供优势,并传递其Listener对象以“返回事物”。

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

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

而现在,你到崩溃的制定者与执行

JSONRequestService service = new JSONRequestService(getApplicationContext()); 

service.withParameters(Parameters).postRequest(); 
+0

谢谢,它给了我下面的错误: '显示java.lang.NullPointerException:试图调用虚拟方法无效的AppController .addToRequestQueue(com.android.volley.Request)'on null object reference' – MahmoudTarek

+0

我没有包含将请求添加到队列中的行,所以我相信您的调试功能可以识别null变量的位置(例如'AppController的。getInstance()'返回null),并且你没有在你的问题中包含该代码,所以我建议回顾一下你需要如何实现'AppController'类 –

+1

谢谢,我得到它的工作:) – MahmoudTarek