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

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


OkHttpClient 是一个用于 Android 和 Java 应用程序的网络请求库,它基于 Apache HTTP 客户端。如果你遇到连续的调用失败,可能是由于以下几个原因: 1. **连接错误**:网络不稳定、服务器宕机或防火墙设置导致无法建立连接。你可以添加重试机制(如设定最大重试次数),在请求失败后稍作延迟再尝试。 ```java Request request = new Request.Builder() .url("your_url") .build(); OkHttpClient client = new OkHttpClient(); client.newCall(request) .enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { if (retryCount < maxRetries) { // 重试计数器加一 retryCount++; // 设置延迟时间 long delay = calculateDelay(retryCount); // 之后再次发送请求 enqueueAfterDelay(call, delay); } else { // 超过最大重试次数,记录失败并处理异常 handleFailure(e); } } // 成功回调 @Override public void onResponse(Call call, Response response) throws IOException { // 处理响应 } }); ``` 这里`enqueueAfterDelay`是自定义的方法,可以根据需要计算延迟时间,比如每次加倍等待时间。 2. **缓存和超时问题**:检查你的OkHttp配置是否设置了合理的超时时间和缓存策略。如果请求过期或者服务器返回了408(请求超时)等错误,需要考虑更新这些设置。 3. **认证或权限问题**:确保你的请求携带正确的认证信息,并且应用有访问目标接口所需的权限。 4. **全局异常处理器**:如果你使用的是拦截器链,检查是否有任何异常处理不当导致后续请求都被标记为失败。 5. **检查网络库版本**:确保使用OkHttp版本兼容应用程序的需求,并且是最新的稳定版,避免已知问题影响性能。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值