【问题标题】:Android Volley: Static vs ObjectAndroid Volley:静态与对象
【发布时间】:2015-09-13 16:05:43
【问题描述】:

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

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

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 个方法。

我有另一个类似的课程,其中包含检查数据准确性的方法。我是否也应该让它们成为实例方法并在我需要的活动中实例化它?

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

【问题讨论】:

    标签: java android static android-volley


    【解决方案1】:

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

    唯一要提到的是,如果您也需要收到对您的请求的响应(可能在将来),您需要在您的类中添加一个委托/回调/接口,以获得正确的结果回到你的调用活动实例......在这种情况下,最好创建一个“非静态实例方法”的方式......但是你也可以向你的类添加一个非静态方法,所以我什么都看不到反对。

    评论更新

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

    如果您下载异步图像并将它们放入 ListView 行中的 ImageViews 中(当用户滚动时),图像加载时间可能会更长,并且 ListView 会在错误的位置显示图像......像这样,您将需要一个单例模式,它将为您管理下载...这对于您的类/静态方法是不可能的

    【讨论】:

    • 现在我假设我收到了来自服务器的响应(我在我的应用程序中需要的 JSON),因为在检查 Internet 连接是否处于活动状态之前我没有向服务器发送任何内容。但是您的回调想法是一个更好的想法。我有很多要学习的。感谢您的回答!如果三天内没有其他答案可供分析,我将接受您的答案作为正确答案。
    • 我认为你需要一直获取请求,因为你需要知道数据是否发送成功。在我的示例中,我有一个人在服务器端工作,如果一切正常,我会收到一条带有 OK 消息的 JSON,否则会收到否定响应。
    • 那是真的......我刚刚回答了你的问题,你没有要求响应处理:-)
    • 再次感谢:)祝您有美好的一天!
    【解决方案2】:

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

    我也使用 Interface 之类的@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:我的项目使用 Google 的官方 Volley 库,而不是在 build.gradle 中使用 compile 'com.mcxiaoke.volley:library:1.0.17'。因此,JsonObjectRequest(...) 的定义会有所不同。

    【讨论】:

    • 感谢您的回复。我从中学到了很多,我将在我的项目中尝试这个。 PS:我也使用官方 Volley 库:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2011-04-19
    相关资源
    最近更新 更多