公司一个同事问的问题
他在写Android客户端的时候提出来的疑问,具体看下面代码(他的代码与这个有差别,但是本质是一样的):
1 public String getLink() { 2 JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { 3 4 @Override 5 public void onResponse(JSONObject response) { 6 shortenURL = response.getString("url"); 7 } 8 }, new Response.ErrorListener() { 9 10 @Override 11 public void onErrorResponse(VolleyError error) { 12 // TODO Auto-generated method stub 13 14 } 15 }); 16 17 18 19 return shortenURL; 20 21 22 }
他说,怎么改进这个代码,熟悉的同学一下子就看出来了,onResponse函数是本质就是callback机制,在onResponse还没有调用完成(shortenURL还没有赋值得到正确结果),getLink就返回了(此时shortenURL是无效的)。
解决办法其实有了:
不要以返回值的方式来写getLink函数,按异步的方式编写getLink,给getLink传入一个callback函数,在onReponse函数成功取得数据后再来调用传入的callback就行了
references:
http://stackoverflow.com/questions/23833977/android-wait-for-volley-response-to-return
http://stackoverflow.com/questions/34184088/how-can-i-return-value-from-function-onresponse-of-retrofit