Android排球:静态与对象

我是初级Android开发人员,我几乎完成了我的第一个大项目的alpha版本。 我认为我对java有很好的了解,但我不确定我是否正确组织了我的应用程序。

简短说明:我在我的应用程序中使用排球库来发送和接收来自服务器的数据。 因此我创建了一个类来管理服务器方法。 在那个类中,我为每个连接到我需要的服务器创建了很多静态方法(比如这个例子):

public static void sendDataToServer(final Context context, final String data) { StringRequest mStringRequest = new StringRequest(Request.Method.POST, URL_VERIFY, new Response.Listener() { @Override public void onResponse(String response) { // get response } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // get error response } }) { @Override protected Map getParams() { Map 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(...)

我的问题是:可以调用我的服务器方法吗? 或者,我应该在启动活动时使它们成为实例方法并实例化MyServerClass吗? 我必须提一下,我在该课程中有大约5种方法。

我有另一个类,有方法来检查数据的准确性。 我是否还应该将它们作为实例方法并在我需要的活动中实例化它?

欢迎任何参考或建议。 提前致谢!

不,在你的情况下,两种方式都会有相同的结果……

唯一要提的是,如果您需要收到对您的请求的响应(可能是将来),您需要在您的class级中添加一个Delegate / Callback / Interface,以便将结果返回给您调用活动实例…在这种情况下,最好创建一个“非静态实例方法”方式……但是你也可以为你的类添加一个非静态方法,所以我没有看到任何反对它的东西。

更新评论

好吧,例如,如果你想提供带有图像的ListView …在大多数情况下,你首先请求带有ListView条目的JSONArray,其中包含位于远程服务器上的位图的链接……

如果你下载Images Async并将它们放入ListView行中的ImageViews中(当用户滚动时),那么图像可能会被加载更长时间并且ListView会在错误的位置显示图像…对于类似的东西你将需要一个Singleton模式,它将为您管理下载…这对于您的类/静态方法是不可能的

虽然这个问题已经有了一个公认的答案,但是,我想分享看起来像你的问题的代码。 希望这可以帮助!

我也使用@Neo回答之类的接口 ,如下所示:

 public interface VolleyResponseListener { void onError(String message); void onResponse(Object response); } 

然后在我的VolleyUtils课程中:

 public static void makeJsonObjectRequest(Context context, String url, final VolleyResponseListener listener) { JsonObjectRequest jsonObjectRequest = new JsonObjectRequest (url, null, new Response.Listener() { @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 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); } 

然后在活动中:

 VolleyUtils.makeJsonObjectRequest(mContext, url, new VolleyResponseListener() { @Override public void onError(String message) { } @Override public void onResponse(Object response) { } }); 

P / S:我的项目使用Google的官方Volley库,而不是在compile 'com.mcxiaoke.volley:library:1.0.17'中使用compile 'com.mcxiaoke.volley:library:1.0.17' 。 因此,JsonObjectRequest(…)将在其定义上有所不同。