gpt4 book ai didi

java - 方法返回了一个值,但该值未正确传递

转载 作者:行者123 更新时间:2023-12-01 18:10:16 26 4
gpt4 key购买 nike

我需要使用 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 block 中传递任何内容。如果是这样,我该怎么做才能正确传递值? try catch block 已经嵌套在似乎固定的 void 方法中。我真的希望有一个解决方案,这样我也可以将该方法变成一个实用程序类。感谢大家的阅读!

最佳答案

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

Volley 请求是异步的 - 它们在工作线程上执行并在将来的某个时候返回结果。您会收到通知,结果位于 onResponse() 中。这就是为什么您在 logcat 中看到正确的内容。

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

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

关于java - 方法返回了一个值,但该值未正确传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33567678/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com