安卓OkHttpClient中onResponse方法内数据的调用

本文介绍如何解决OkHttp异步请求中获取的数据无法直接在主线程使用的难题,通过使用Callable接口来实现异步请求结果的同步返回,使得数据可以在主线程中方便地被调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习中,难免有一些坑,每次遇到坑我就和大家分享一下,在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()这个接口中的方法恰好可以等你的异步线程完成了,然后把结果返回,这样就可以在主线程中使用,我不知道这样会不会给程序带来麻烦,只是为了完成功能。大佬勿喷


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值