方法返回一个值,但值未正确传递

时间:2015-11-06 13:16:08

标签: java android parameters try-catch android-volley

我需要使用Volley请求将一些数据从远程服务器返回到我的应用程序,但经过一段时间的测试后,我无法使其正常工作。

我的代码如下:

String recipientUsername = foo;
picture = retrievedPicture(recipientUsername);
Log.i(TAG, "String picture: " + picture);
recipientPicture = (NetworkImageView) findViewById(R.id.chat_image_circle_pic);
recipientPicture.setImageUrl(picture, imageLoader);

因此全局声明picture以从内部使用Volley的方法中检索值。在我的日志中读取上面的行时看起来像这样:

I/ChatActivity: String picture: null

当方法本身实际返回某些内容时,会更加混乱。该方法如下所示:

public String retrievedPicture(final String username) {
    // Tag used to cancel request
    String tag_string_req = "req_update_user";

    StringRequest stringRequest = new StringRequest(Request.Method.POST,
            AppConfig.URL_RETRIEVE, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.d(TAG, "User is retrieving on MySQL: " + response.toString());

            try {
                JSONObject jObj = new JSONObject(response);
                boolean error = jObj.getBoolean("error");
                if (!error) {
                    // Do no changes on SQLite at the moment
                    JSONObject userObj = jObj.getJSONObject("user");
                    picture = userObj.getString("picture");
                    Log.d(TAG, "Picture retrieved from MySQL: " + picture);
                } else {
                    // Error occurred in updating user's data. Get the error message from php node:
                    String errorMsg = jObj.getString("error_msg");
                    Log.e(TAG, errorMsg);
                    //Toast.makeText(getActivity(), errorMsg, Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "Error in retrieving user's data: " + error);
        }
    }) {
        @Override
        protected Map<String, String> getParams() {
            // Posting the params to php (nodes, data to be changed)
            Map<String, String> params = new HashMap<>();
            params.put("tag", "retrievepic");
            params.put("username", username);
            return params;
        }
    };

    // Adding request to the request queue
    AppController.getInstance().addToRequestQueue(stringRequest, tag_string_req);

    return picture;
}

日志显示方法确实有效:

D/ChatActivity: User is retrieving on MySQL: {"tag":"retrievepic","error":false,"uid":19,"user":{"username":"test07","picture":"http:\/\/192.168.0.3\/worka\/uploads\/test07_05112015_155304.jpg"}}
D/ChatActivity: Picture retrieved from MySQL: http://192.168.0.3/worka/uploads/test07_05112015_155304.jpg

所以我猜测的是我没有从方法的try catch块传递任何东西。如果是这样,我该怎么做才能正确传递值? try catch块已经嵌套在似乎已修复的void方法中。我真的希望有解决方案,所以我也可以将方法变成实用类。感谢您阅读!

4 个答案:

答案 0 :(得分:1)

  

所以我能猜到的是我没有通过尝试传递任何东西   抓住方法块。

您将返回picture的当前值。您正在做错误的假设,即UI线程正在等待

AppController.getInstance().addToRequestQueue

完成。这不是真的。

答案 1 :(得分:1)

您的问题是,当您从方法返回时,picture始终为空。

Volley请求是异步的 - 它们在工作线程上执行,并在将来的某个时间返回结果。系统会通知您onResponse()中的结果。这就是你在logcat中看到正确的东西的原因。

当您从方法返回picture时,请求尚未执行,picture的值为null

作为解决方案,您应该更改方法的返回类型,将请求执行到void并将图像加载逻辑移动到onResponse()

答案 2 :(得分:1)

retrievedPicture()方法会返回图片的默认值很明显,因为volley will execute request asynchronously

在第AppController.getInstance().addToRequestQueue(stringRequest, tag_string_req);行。你是executing volley request asynchronous,我是n very next line you are returning picture, yet volley response is not received。这就是您的方法返回default value的原因。

你应该在recipientPicture.setImageUrl(picture, imageLoader);方法中执行onResponse(),其中收到了凌空响应。

答案 3 :(得分:1)

picture之前的onResponse返回。

尝试使用EventBus

使用EventBus发布Event

你可以参加活动并继续。