继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

网络编程的最佳实践

慕尼黑0536602
关注TA
已关注
手记 37
粉丝 3
获赞 6

也许你还没有发现,之前我们的写法其实是很有问题的。因为一个应用程序很可能会在许多地方都会使用到网络功能,而发送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);
        }
    });
}

http://img3.mukewang.com/5f95643c0001c5ff04930718.jpg

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP