话不多说直接上有问题的代码
public static String getlogin(String url)throws Exception {
client = new AsyncHttpClient();
client.get(url, new TextHttpResponseHandler() {
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
}
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
result=responseString;
}
});
return result;
}
这个get方法本身没有问题,但是当他放置到一个带有返回值的方法中,并且这个返回值是通过onsuccess回调方法设置的,这就有问题了。onsuccess可以直接进行ui修改,也就是说onsuccess是在ui线程上的,最终会导致result总是先返回了了,才会执行onsuccess设置result,当你带有数据的时候,会出现第一次访问什么数据都没有,而第二次访问获得的结果是第一次的结果,第三次是第二次的,以此类推。那么我们如何解决呢?
问题就是 return result跟result=responseString方法先后执行的顺序问题,这个时候有没有一种方法可以避免出现这种顺序问题,有的,不让这个方法有返回值不就行了么!
使用自定义回调接口实现回调可以完全避免这个问题
如果对回调不熟悉的可以看以下这篇博客
回调详解
首先定义一个回调接口
public interface CallBack {
public void solve(String result);
}
然后在你需要调用上面那个方法的activity中实现这个接口,这个solve里填写你的一系列操作,我只列出跟问题相关的代码
public class LoginActivity extends BaseActivity implements CallBack {
@Override
public void solve(String result) {
}
}
}
最后就是最开始那个方法的变化了
public static void getlogin(String url, final CallBack callBack)throws Exception {
client = new AsyncHttpClient();
client.get(url, new TextHttpResponseHandler() {
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
}
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
result=responseString;
callBack.solve(result);
}
});
}
整个流程的执行顺序就是执行getlogin()->onSuccess()->solve(),当onsuccess执行后会回到activity中的solve,solve中的参数就是原先你想要返回的数据,这样不是通过方法return返回数据,而是通过接口回调返回数据,效果等于变相的把return result 放到了onsuccess里。