【问题标题】:Cannot assign value to final Volley variable response无法为最终 Volley 变量响应赋值
【发布时间】:2015-11-04 12:41:57
【问题描述】:

我熟悉 Volley 并创建一个 Singleton 类,并将请求添加到队列中。但是,我希望增加 volley 的模块化,并通过方法调用将所有请求简单地调用到另一个类。我已将当前操作设置为常见 GET 请求的基础:

public Object getRequest(String params) {

    final JSONObject getRequestReturn = new JSONObject();

    JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET,
            VolleySingleton.prefixURL, ((String) null),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {

                    // Parse the JSON:
                    try {
                        getRequestReturn = response;

                        Log.v("GET Request value", response.toString());

                    } catch (JSONException e) {
                        e.printStackTrace();
                    } catch (NullPointerException e) {
                        e.printStackTrace();
                    }

                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("GET Request Error", error.toString());
                }
            });

    mRequestQueue.add(getRequest);

    return getRequestReturn;
}

但是,我在分配响应时遇到了令人困惑的 catch 22 错误:

getRequestReturn = response;

错误指出必须将 getRequestReturn 声明为 final 以允许在内部类中使用,但在分配 final 时,会出现另一个错误,指出您无法为 final 变量赋值。

如何处理这种方法?

【问题讨论】:

  • 声明getRequestReturn到类级
  • 不要这样用return,你什么都得不到,请看我在下面问题stackoverflow.com/questions/32627089/…的回答
  • @BNK 怎么样:stackoverflow.com/questions/19837820/…,看起来很简洁,调用也很干净,很简单:RequestQueue requestQueue = Volley.newRequestQueue(getActivity()); CustomRequest jsObjRequest = new CustomRequest(Method.POST, url, params, this.createRequestSuccessListener(), this.createRequestErrorListener()); requestQueue.add(jsObjRequest);
  • @Sauron:没关系,当然,但是,我的意思是如果你将这些行移到一个方法/函数中,然后在该方法的末尾返回,你将什么也得不到(null)与该返回值。我会给你另一个链接供你参考:)

标签: android android-volley final


【解决方案1】:

将 JSONObject 声明为全局并像这样在同一个地方初始化。

 JSONObject getRequestReturn ;


getRequestReturn = new JSONObject();

【讨论】:

    【解决方案2】:
    public Object getRequest(String params) {
    
        JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET,
                VolleySingleton.prefixURL, ((String) null),
                new Response.Listener<JSONObject>() {
                    @Override 
                    public void onResponse(JSONObject response) {
    
                        // Parse the JSON: 
                        try { 
    
                            Log.v("GET Request value", response.toString());
    
                        } catch (JSONException e) {
                            e.printStackTrace();
                        } catch (NullPointerException e) {
                            e.printStackTrace();
                        } 
    
                    } 
                }, 
                new Response.ErrorListener() {
                    @Override 
                    public void onErrorResponse(VolleyError error) {
                        Log.d("GET Request Error", error.toString());
                    } 
                }); 
    
        mRequestQueue.add(getRequest);
    
        return new JSONObject();
    } 
    

    当你返回时你不能得到responseVolleyrequest是异步的!

    我使用EventBus,我是这样操作的:

    当我需要从网络获取数据时,我会添加这样的请求。

    然后当我收到来自网络的响应时,我使用 EventBus 发布事件。

    我收到事件并更新我的页面。

    或者你可以试试 RxAndroid。

    【讨论】:

    • 这不会输出任何东西,因为它只是返回一个新的 JSON 对象......不是网络操作输出的结果
    • 这将在结果到来之前返回
    • @Sauron:小小的阳光是对的,你可以参考我上面评论的2个链接。
    • @BNK 你可以提供一个答案,因为微小的阳光近在咫尺
    • @Sauron:我明天会发布我的答案。我现在在手机上,很难格式化代码。
    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 2019-08-19
    • 2013-06-20
    • 1970-01-01
    • 2012-05-19
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多