Android 排球:静态与对象
Android Volley: Static vs Object
我是一名初级 android 开发人员,我几乎完成了我的第一个大项目的 alpha 版本。我认为我对 java 有很好的了解,但我不确定我是否正确组织了我的应用程序。
简短说明: 我在我的应用程序中使用 volley 库从服务器发送和接收数据。因此,我创建了一个 class 来管理服务器方法。在那 class 我为我需要的每个服务器连接创建了很多静态方法(就像这个例子):
public static void sendDataToServer(final Context context, final String data) {
StringRequest mStringRequest = new StringRequest(Request.Method.POST, URL_VERIFY, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// get response
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// get error response
}
}) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<>();
// the POST parameters:
params.put(API_KEY, API_KEY_VALUE);
params.put(API_KEY_DATA, data);
return params;
}
};
Volley.newRequestQueue(context).add(mStringRequest);
}
所以在我的活动中,我称之为 MyServerClass.sendDataToServer(...)
我的问题是: 可以这样调用我的服务器方法吗?或者我应该让它们成为实例方法并在 activity 启动时实例化 MyServerClass
吗?我必须提到我在 class.
中有大约 5 种方法
我有另一个 class 类似的方法来检查数据的准确性。我是否也应该使它们成为实例方法并在我需要的活动中实例化它?
欢迎任何参考或建议。提前致谢!
不,在你的情况下,两种方式都会有相同的结果...
唯一要提的是,如果您也需要接收对您的请求的响应(可能在将来),您将需要向您的 class 添加一个委托/回调/接口, 将结果直接返回到您的调用 activity 实例...在这种情况下,最好创建一个 "non-static instance method" 方式...但是您可以向您的 [ 添加一个非静态方法=26=] 也是如此,所以我没有看到任何反对意见。
评论更新
例如,如果您想提供带有图像的 ListView...在大多数情况下,您首先会请求带有 ListView 条目的 JSONArray,其中包含指向位于远程服务器上的位图的链接...
如果您下载 Images Async 并将它们放入 ListView 行中的 ImageViews(当用户滚动时),则图像加载时间可能会更长,并且 ListView 会在错误的位置显示图像...对于类似的东西,您将需要一个单例模式,它将为您管理下载...您的 class/static 方法
无法做到这一点
虽然这个问题已经有一个公认的答案,但是,我想分享我的代码,看起来像你的问题。希望这对您有所帮助!
我也是用Interface像@Neo的回答,如下:
public interface VolleyResponseListener {
void onError(String message);
void onResponse(Object response);
}
然后在我的 VolleyUtils class:
public static void makeJsonObjectRequest(Context context, String url, final VolleyResponseListener listener) {
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
(url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
listener.onResponse(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onError(error.toString());
}
}) {
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
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));
}
}
};
// Access the RequestQueue through singleton class.
VolleySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest);
}
然后在 Activity:
VolleyUtils.makeJsonObjectRequest(mContext, url, new VolleyResponseListener() {
@Override
public void onError(String message) {
}
@Override
public void onResponse(Object response) {
}
});
P/S:我的项目使用Google的官方Volley库,而不是在build.gradle
中使用compile 'com.mcxiaoke.volley:library:1.0.17'
。因此,JsonObjectRequest(...) 的定义会有所不同。
我是一名初级 android 开发人员,我几乎完成了我的第一个大项目的 alpha 版本。我认为我对 java 有很好的了解,但我不确定我是否正确组织了我的应用程序。
简短说明: 我在我的应用程序中使用 volley 库从服务器发送和接收数据。因此,我创建了一个 class 来管理服务器方法。在那 class 我为我需要的每个服务器连接创建了很多静态方法(就像这个例子):
public static void sendDataToServer(final Context context, final String data) {
StringRequest mStringRequest = new StringRequest(Request.Method.POST, URL_VERIFY, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// get response
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// get error response
}
}) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<>();
// the POST parameters:
params.put(API_KEY, API_KEY_VALUE);
params.put(API_KEY_DATA, data);
return params;
}
};
Volley.newRequestQueue(context).add(mStringRequest);
}
所以在我的活动中,我称之为 MyServerClass.sendDataToServer(...)
我的问题是: 可以这样调用我的服务器方法吗?或者我应该让它们成为实例方法并在 activity 启动时实例化 MyServerClass
吗?我必须提到我在 class.
我有另一个 class 类似的方法来检查数据的准确性。我是否也应该使它们成为实例方法并在我需要的活动中实例化它?
欢迎任何参考或建议。提前致谢!
不,在你的情况下,两种方式都会有相同的结果...
唯一要提的是,如果您也需要接收对您的请求的响应(可能在将来),您将需要向您的 class 添加一个委托/回调/接口, 将结果直接返回到您的调用 activity 实例...在这种情况下,最好创建一个 "non-static instance method" 方式...但是您可以向您的 [ 添加一个非静态方法=26=] 也是如此,所以我没有看到任何反对意见。
评论更新
例如,如果您想提供带有图像的 ListView...在大多数情况下,您首先会请求带有 ListView 条目的 JSONArray,其中包含指向位于远程服务器上的位图的链接...
如果您下载 Images Async 并将它们放入 ListView 行中的 ImageViews(当用户滚动时),则图像加载时间可能会更长,并且 ListView 会在错误的位置显示图像...对于类似的东西,您将需要一个单例模式,它将为您管理下载...您的 class/static 方法
无法做到这一点虽然这个问题已经有一个公认的答案,但是,我想分享我的代码,看起来像你的问题。希望这对您有所帮助!
我也是用Interface像@Neo的回答,如下:
public interface VolleyResponseListener {
void onError(String message);
void onResponse(Object response);
}
然后在我的 VolleyUtils class:
public static void makeJsonObjectRequest(Context context, String url, final VolleyResponseListener listener) {
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
(url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
listener.onResponse(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onError(error.toString());
}
}) {
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
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));
}
}
};
// Access the RequestQueue through singleton class.
VolleySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest);
}
然后在 Activity:
VolleyUtils.makeJsonObjectRequest(mContext, url, new VolleyResponseListener() {
@Override
public void onError(String message) {
}
@Override
public void onResponse(Object response) {
}
});
P/S:我的项目使用Google的官方Volley库,而不是在build.gradle
中使用compile 'com.mcxiaoke.volley:library:1.0.17'
。因此,JsonObjectRequest(...) 的定义会有所不同。