我是android和OOP的新手。我知道Fowler难闻的气味之一是代码重复。在我的整个项目中,我从事不同活动的排球请求大约有25个,而所有这些请求中都有90%的相同代码。
看看这个伪代码:
on Error:
if no connection:
Toast "no connection"
else if no response:
Toast "server error"
else
show popup with a retry button which will call the function which this request is inside it again.
我的第一个问题是如何在一个地方写这些,并在不同地方使用整个请求对象。
我的第二个问题是某些特殊活动中有一些与活动相关的代码。例如,在我的登录页面上,我没有未经授权错误,但在其他页面上却有。或者如您所见,在上述代码的最后一个 else 中,我说过要调用该函数,如果每个请求都不同。我该如何处理?
我该怎么做? 有什么特别的参考吗? tnx
答案 0 :(得分:0)
不要将代码重复,而是将代码放在函数中(带或不带参数,取决于您的任务要求),然后在程序中所需的位置调用它。
如果您不知道如何在Android或Java中创建函数,请点击此链接 http://www.learnjavaonline.org/en/Functions
答案 1 :(得分:0)
您可以创建一个util类来创建请求。
例如,这是一个能够使用JSONObject
创建GET请求的类,该请求在出错时显示Toast消息,并在成功时执行作为参数传递的功能:
public class VolleyUtils{
public static JsonObjectRequest createGetRequest(String url, Consumer<? super JSONObject> successCallback){
return new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
successCallback.consume(response)
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (volleyError instanceof TimeoutError || volleyError instanceof NoConnectionError) {
VolleyUtils.showToast("No Internet connection");
} else if (volleyError instanceof AuthFailureError) {
VolleyUtils.showToast("Bad authentication");
} else if (volleyError instanceof ServerError) {
VolleyUtils.showToast("Error with server");
} else if (volleyError instanceof NetworkError) {
VolleyUtils.showToast("Network error");
} else if (volleyError instanceof ParseError) {
VolleyUtils.showToast("Parsing Error");
}
}
});
}
private static void showToast(String errorText){
Toast.makeText(getApplicationContext(), errorText, Toast.LENGTH_SHORT).show();
}
}
因此,要创建一个新请求,只需执行以下操作:
//supposing you get the RequestQueue with Singleton Pattern
MySingleton.getInstance().addToRequestQueue(VolleyUtils.createGetRequest("www.google.com", (JSONObject response) -> {
//stuff to do when request has success, for example :
myTextView.setText(response.toString())
} ));