RxAndroid入门实例(结合OkHttp)

思考从网络请求数据的异步任务,通常使用AsyncTask或其他方式将异步任务与当前活动绑定在一起。这样做有很多风险,活动的负担太重,线程也不能及时的关闭。或者把异步任务封装在工具类里,利用接口回调得到数据,但是这样也不是很好。下面看看rx怎么实现从网上下载一张图片并赋值给UI:

别忘了添加网络权限

1.首先创建一个工具类并写一个方法,返回值为一个观察者,泛型是想要的数据(字节数组):

public class DownLoadUtil {
    private OkHttpClient client;

    public DownLoadUtil(){
        client=new OkHttpClient();
    }

    public Observable<byte []> download(String path){
        return Observable.create(new Observable.OnSubscribe<byte[]>() {
            @Override
            public void call(Subscriber<? super byte[]> subscriber) {
                if (!subscriber.isUnsubscribed()){
                    //在这里访问网络并发送数据
                    Request request=new Request.Builder().url(path).build();
                    client.newCall(request).enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                        }
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            if (response.isSuccessful()){
                                subscriber.onNext(response.body().bytes());
                                subscriber.onCompleted();
                            }
                        }
                    });
                }
            }
        });
    }
}

使用OkHttp进行网络请求,拿到字节数组后调用观察者的onNext进行发送。


2.在活动中创建这个被观察者并订阅自定义的观察者,在onNext中处理数据:

DownLoadUtil util=new DownLoadUtil();
                util.download(path).observeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Subscriber<byte[]>() {
                            @Override
                            public void onCompleted() {
                            }
                            @Override
                            public void onError(Throwable e) {
                            }
                            @Override
                            public void onNext(byte[] bytes) {
                                Bitmap bitmap=BitmapFactory.decodeByteArray(bytes,0,bytes.length);
                                iv.setImageBitmap(bitmap);
                            }
                        });

被观察者调用的两个observeOn第一个是指任务在网络请求中执行涉及io,第二个表示任务在主线程执行。我的这段代码是写在一个点击事件中,虽然涉及UI操作,但是因为指定在主线程执行所以没有任何问题。


可以看到整个结构非常清晰,异步网络任务在被观察者中进行,拿到数据后发送给观察者,观察者进行UI赋值等操作。首先活动的负担大大减少,其次异步线程也很好控制。

SmartRefreshLayout是一个实现下拉刷新和上拉加载的库,而OkHttp是一个常用的网络请求库。结合使用它们可以实现在下拉刷新时发起网络请求并更新数据。 下面是一个示例代码: ```java // 1. 创建OkHttpClient OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .build(); // 2. 创建Retrofit Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .client(client) .build(); // 3. 创建API接口 ApiService apiService = retrofit.create(ApiService.class); // 4. 创建SmartRefreshLayout.OnRefreshListener实例,并在其中发起网络请求 SmartRefreshLayout refreshLayout = findViewById(R.id.refreshLayout); refreshLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(RefreshLayout refreshlayout) { // 使用apiService发起网络请求 Call<Data> call = apiService.getData(); call.enqueue(new Callback<Data>() { @Override public void onResponse(Call<Data> call, Response<Data> response) { // 更新数据 adapter.setData(response.body()); // 停止下拉刷新动画 refreshlayout.finishRefresh(); } @Override public void onFailure(Call<Data> call, Throwable t) { // 错误处理 // 停止下拉刷新动画 refreshlayout.finishRefresh(false); } }); } }); ``` 以上代码中,我们首先创建了一个OkHttpClient实例,然后通过它创建了一个Retrofit实例。接着,我们创建了一个API接口ApiService,并使用它发起了网络请求。在SmartRefreshLayout.OnRefreshListener中,我们在下拉刷新时发起了网络请求,并在回调中更新数据并停止下拉刷新动画。注意,代码中的Data和adapter.setData()方法需要根据具体情况进行替换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值