2015-09-13 48 views
2

我是一名初级android开发人员,我几乎完成了我的第一个大型项目的alpha版本。我认为我对java有很好的了解,但我不确定我是否组织了我的应用程序。Android排球:静态vs物体

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

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(...)

我的问题是:是它可以打电话给我的服务器方法吗?或者我应该让他们实例化方法并在活动开始时实例化MyServerClass?我必须提到,我在该课上有大约5种方法。

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

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

回答

1

没有,你的情况,这两种方式都会有同样的结果...

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

UPDATE发表评论

嗯例如,如果你想为用户提供图像一个ListView ......在大多数情况下,你第一次请求您的ListView项进行JSONArray,其中包含位于链接位图远程服务器...

如果您下载图像异步并将它们放入ListView行中的ImageView(用户滚动时),则可能图像加载时间更长,ListView将显示图像错误的地方...对于这样的事情,你需要一个Singleton模式,它将为你管理下载...这将不可能无线你的班/静态方法

+0

现在我认为我收到服务器的响应(我需要在我的应用中使用JSON),因为在检查互联网连接是否处于活动状态之前,我没有向服务器发送任何消息。但是你的回调想法是一个更好的想法。我有很多要学习的。感谢您的回答!如果在三天内没有其他答案需要分析,我会接受你的答案作为正确答案。 –

+0

是的,如果您需要获得...的请求,您可以通过接口来完成...... –

+0

我认为您需要始终获取请求,因为您需要知道数据是否已成功发送。在我的例子中,我有一个人在服务器端工作,如果一切都正确到达,我会收到带有OK消息的JSON,否则就是否定的回应。 –

1

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

我也用接口像@ 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<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); 
} 

然后在活动:

VolleyUtils.makeJsonObjectRequest(mContext, url, new VolleyResponseListener() { 
     @Override 
     public void onError(String message) { 

     } 

     @Override 
     public void onResponse(Object response) { 

     } 
    }); 

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

+1

感谢您的回复。我从中学到了很多,我会在我的项目中尝试。 PS:我也使用官方Volley图书馆:) –