在学习中,难免有一些坑,每次遇到坑我就和大家分享一下,在okhttp中我们成功的访问后台,然后从onResponse中获得了返回的json数据(安卓和后台一般用json格式做数据交互),然后你会发现这个返回的数据你只能在onResponse方法内调用,放到方法外,这个数据就不好用,也不是不好用就是你弄不出去,追根揭底就是okhttp是异步请求,你没办法将异步请求的结果放到主线程中使用,但是我们有没有方法做到上面效果呢?有的,往下看
@Override
public ArrayList<Music> call() throws Exception {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(httpURL+"/HttpWeb/selectMusicInformation")//请求的url
.get()
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String res = response.body().string();
try{
Gson gson = new Gson();
list = gson.fromJson(res, new TypeToken<ArrayList<Music>>() {
}.getType());
}catch (JsonSyntaxException e){
e.printStackTrace();
}
}
});
return list;
}
call()这个方法是继承了Callable这个接口,它可以等你的异步线程完成了,然后将你获得的数据作为方法的返回值,这样你就可以获得这个数据
public class MainActivity extends Activity implements View.OnClickListener,Callable<ArrayList<Music>>{
反正我在写这个okhttp的方法在这里耽误了好几天,结果就是异步线程的数据,没办法在主线程中调用,Callable()这个接口中的方法恰好可以等你的异步线程完成了,然后把结果返回,这样就可以在主线程中使用,我不知道这样会不会给程序带来麻烦,只是为了完成功能。大佬勿喷