RxJava

发布于:2023-01-20 ⋅ 阅读:(312) ⋅ 点赞:(0)

目录

1 RxJAVA简介

1 什么是RxJava

2.RxJava好在哪

3.什么是观察者模式?

4.RxJava原理理解

5.实例

2.Retrofit+OkHTTP+RxJava+RecycleView的实现步骤

第一步:创建项目

第二步:导入依赖

第三步:添加网络权限

第四步:在activity_main.xml添加Recycle,并给其设置id

第五步:创建子布局

第六步:创建实体类

第七步:创建适配器

第八步:设置适配器

第九步:进行网络请求


1 RxJAVA简介

1 什么是RxJava

        我对它的定义是:RxJava 本质上是一个异步操作库,是一个能让你用极其简洁的逻辑去处理繁琐复杂任务的异步事件库。

2.RxJava好在哪

        Android平台上为已经开发者提供了 AsyncTask,Handler 等用来做异步操作的类库,那我们为什么还要选 择RxJava 呢?答案是简洁! RxJava 可以用非常简洁的代码逻辑来解决复杂问题;而且即使业务逻辑的越来越复杂,它依然能够保持简洁!再配合上Lambda 用简单的几行代码分分钟就解决你负责的业务问题。

3.什么是观察者模式?

        举个栗子,Android View 的点击监听器的实现, View 是被观察者, OnClickListener 对象是观察者, Activity要如何知道 View 被点击了?那就是派一个 OnClickListener 对象,入驻 View ,与 View 达成一个订 阅关系,一旦View 被点击了,就通过 OnClickListener 对象的 OnClick 方法传达给 Activity 。采用观察者模式可以避免去轮询检查,节约有限的cpu 资源。

4.RxJava原理理解

        被观察者通过订阅将事件按顺序依次传递给观察者 

5.实例

1. 建立被观察者 Observable & 生产事件
2. 建立观察者 Observer 并 定义响应事件的行为
3. 经过订阅 Subscribe 链接观察者和被观察者
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //建立观察者 向被观察者发送消息
        Observable observable=Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onComplete();
            }
        });
        //建立被观察者 接收观察者的消息进行处理
        Observer observer=new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("onSubscribe","开始连接");
            }

            @Override
            public void onNext(Object o) {
                Log.i("onNext","接收到的值是"+o);
            }

            @Override
            public void onError(Throwable e) {
                Log.i("onError","失败");
            }

            @Override
            public void onComplete() {
                Log.i("onComplete","完成");
            }
        };
            //被观察者向观察者进行订阅
            observable.subscribe(observer);
    }
}

2.Retrofit+OkHTTP+RxJava+RecycleView的实现步骤

第一步:创建项目

第二步:导入依赖

//for rxjava
implementation 'io.reactivex.rxjava2:rxjava:2.2.6'
//for rxandroid
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
//衔接 Retrofit & RxJava,此处一定要注意使用RxJava2的版本
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
//添加Retrofit依赖
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
//添加Gson解析
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
//添加图片加载库依赖
implementation 'com.github.bumptech.glide:glide:4.12.0'

第三步:添加网络权限

<uses-permission android:name="android.permission.INTERNET" />

第四步:在activity_main.xml添加Recycle,并给其设置id

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity2"
    android:padding="15dp"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_news"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

第五步:创建子布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="150dp"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:cardElevation="5dp"
    app:cardCornerRadius="5dp"
    android:layout_marginTop="10dp">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="140dp"
        android:layout_margin="5dp">


        <ImageView
            android:id="@+id/news_pic"
            android:scaleType="fitXY"
            android:layout_width="140dp"
            android:layout_height="140dp"
            app:srcCompat="@drawable/ic_launcher_background" />

        <TextView
            android:id="@+id/news_title"
            android:layout_toRightOf="@+id/news_pic"
            android:layout_marginStart="20dp"
            android:textSize="16sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView" />

        <TextView
            android:id="@+id/news_desc"
            android:layout_marginTop="20dp"
            android:layout_alignLeft="@+id/news_title"
            android:layout_below="@+id/news_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView" />
    </RelativeLayout>

</androidx.cardview.widget.CardView>

第六步:创建实体类

package com.hopu.day23_rxjava.model;

import java.util.List;

public class News {
    private boolean success;
    private String title;
    private String subtitle;
    private String update_time;
    private List<Data> data;
    public void setSuccess(boolean success) {
        this.success = success;
    }
    public boolean getSuccess() {
        return success;
    }

    public void setTitle(String title) {
        this.title = title;
    }
    public String getTitle() {
        return title;
    }

    public void setSubtitle(String subtitle) {
        this.subtitle = subtitle;
    }
    public String getSubtitle() {
        return subtitle;
    }

    public String getUpdate_time() {
        return update_time;
    }

    public void setUpdate_time(String update_time) {
        this.update_time = update_time;
    }

    public void setData(List<Data> data) {
        this.data = data;
    }
    public List<Data> getData() {
        return data;
    }

    public class Data {

        private int index;
        private String title;
        private String desc;
        private String pic;
        private String hot;
        private String url;
        private String mobilUrl;
        public void setIndex(int index) {
            this.index = index;
        }
        public int getIndex() {
            return index;
        }

        public void setTitle(String title) {
            this.title = title;
        }
        public String getTitle() {
            return title;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }
        public String getDesc() {
            return desc;
        }

        public void setPic(String pic) {
            this.pic = pic;
        }
        public String getPic() {
            return pic;
        }

        public void setHot(String hot) {
            this.hot = hot;
        }
        public String getHot() {
            return hot;
        }

        public void setUrl(String url) {
            this.url = url;
        }
        public String getUrl() {
            return url;
        }

        public void setMobilUrl(String mobilUrl) {
            this.mobilUrl = mobilUrl;
        }
        public String getMobilUrl() {
            return mobilUrl;
        }
    }
}

第七步:创建适配器

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {
    List<News.Data> list;

    public void setResource(List<News.Data> list){
        this.list=list;

        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item,parent,false);
        ViewHolder viewHolder=new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        News.Data data=list.get(position);
        holder.news_title.setText(data.getTitle());
        holder.news_desc.setText(data.getDesc());
        Glide.with(holder.view).load(data.getPic()).into(holder.news_pic);
    }

    @Override
    public int getItemCount() {
        if (list==null){
            return 0;
        }else {
            return list.size();
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView news_title,news_desc;
        ImageView news_pic;
        View view;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            view=itemView;
            news_desc=itemView.findViewById(R.id.news_desc);
            news_title=itemView.findViewById(R.id.news_title);
            news_pic=itemView.findViewById(R.id.news_pic);
        }
    }
}

第八步:设置适配器

private RecyclerView rv_news;
    NewsAdapter newsAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        rv_news=findViewById(R.id.rv_news);
        newsAdapter=new NewsAdapter();
        LinearLayoutManager layoutManager=new LinearLayoutManager(MainActivity2.this);
        rv_news.setLayoutManager(layoutManager);
        rv_news.setAdapter(newsAdapter);

        retrofitGet();
    }

第九步:进行网络请求

1. 创建请求接口
public interface News_Interface {

    @GET("api/hotlist?type=baiduRD")
    Observable<News> getNews();
}

2. 开始网络请求

3. 处理返回结果
 private void retrofitGet() {
        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("https://api.vvhan.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        News_Interface newsInterface=retrofit.create(News_Interface.class);
        Observable<News> observable=newsInterface.getNews();

        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<News>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(News news) {
                        newsAdapter.setResource(news.getData());
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i("onError","连接失败");
                    }

                    @Override
                    public void onComplete() {

                    }
                });

本文含有隐藏内容,请 开通VIP 后查看