也许你还没有发现,之前我们的写法其实是很有问题的。因为一个应用程序很可能会在许多地方都会使用到网络功能,而发送HTTP请求的代码基本都是相同的,如果我们每次都会编写一遍代码,发送HTTP请求的代码,这显然是非常差劲的做法。
通常情况下,我们都应该将这些通用的网络操作提取到一个公共的类里,并提供一个静态方法,当想要发起网络请求的时候,只需简单地调用一下这个方法即可。
还有一个重要的事情,为了解决线程堵塞的问题,只需要使用Java的回调机制就可以。
我们就来使用OkHttp来写一个带有回调机制的http请求。
package com.example.webviewapplication; import okhttp3.OkHttpClient; import okhttp3.Request; public class HttpUtil { public static void sendOkHttpRequest(String address,okhttp3.Callback callback){ OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(address) .build(); client.newCall(request).enqueue(callback); } }
可以看到,sendOkHttpRequest()方法中有一个okhttp3.Callback参数,这个是OkHttp库中自带的一个回调接口,然后再client.newCall()之后没有像之前那样一直调用execute()方法,而是调用了一个enqueue()方法,并把okhttp3.Callback参数传入。OkHttp在enqueue()方法的内部已经帮我们开好了子线程,然后会在子线程中去执行HTTP请求,并将最终的请求结果回调到okhttp3.Callback当中。
那么,我们在调用sendOkHttpRequest()方法的时候就可以这样写:
HttpUtil.sendOkHttpRequest("http://www.baidu.com", new okhttp3.Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { Toast.makeText(MainActivity.this, "打开失败", Toast.LENGTH_SHORT).show(); } @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { String responseData = response.body().string(); showData(responseData); } });
showData记得要用runUiOnThread,要不是显示不了在UI界面上的。
private void showData(final String responseData) { runOnUiThread(new Runnable() { @Override public void run() { txt.setText(responseData); } }); }
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦