公司一个同事问的问题

他在写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

 

posted @ 2017-04-19 18:04  foo__hack  阅读(250)  评论(0编辑  收藏  举报