我需要使用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方法中。我真的希望有解决方案,所以我也可以将方法变成实用类。感谢您阅读!
答案 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
。
你可以参加活动并继续。