网络连接框架 OKHTTP Retrofit RxJAVA

目录

OKHTTP

OKHttp是一个高效的HTTP库:

OKHttp的同步GET使用步骤:

第一步:添加依赖

第二步:设置网络权限

第三步:进行网络请求

第四步:Handler

OKHTTP的异步GET使用步骤

第一步:添加依赖

第二步:设置网络权限

第三步:进行网络请求

第四步:Handler

OKHTTP的同步POST使用步骤

第一步:添加依赖

第二步:设置网络权限

第三步:进行网络请求

第四步:Handler

OKHTTP的异步POST使用步骤

第一步:添加依赖

第二步:设置网络权限

第三步:进行网络请求

第四步:Handler

总结:

Retrofit

Retrofit的使用 (异步GET)

添加Retrofit库的依赖

添加网络权限

创建接收服务器返回数据的类

创建用于描述网络请求的接口

创建Retrofit实例

创建网络请求接口实例

发送网络请求

处理返回结果

Retrofit的使用(异步POST)

添加Retrofit库的依赖

添加网络权限

创建接收服务器返回数据的类

创建用于描述网络请求的接口 (接收请求体)

创建Retrofit实例

创建网络请求接口实例

发送网络请求

处理返回结果

Retrofit+OkHTTP+RecycleView的实现步骤

第一步: 创建项目

第二步:导入依赖

第三步:添加网络权限

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

第五步:创建子布局 news_item.xml

第六步:创建实体类

第七步:创建适配器

第八步:设置适配器

第九步:进行网络请求

RxJAVA

RxJAVA简介

响应式编程

RxJava原理理解

 RxJava实例

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

第一步: 创建项目

第二步:导入依赖

第三步:添加网络权限

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

第五步:创建子布局

第六步:创建实体类

第七步:创建适配器

第八步:设置适配器

第九步:进行网络请求


OKHTTP

OKHttp是一个网络请求开源项目,Android网络请求轻量级框架,支持文件上传与下载,支持https。

OKHttp是一个高效的HTTP库:

  • 支持HTTP/2, HTTP/2通过使用多路复用技术在一个单独的TCP连接上支持并发, 通过在一个连接上 一次性发送多个请求来发送或接收数据
  • 如果HTTP/2不可用, 连接池复用技术也可以极大减少延时
  • 支持GZIP, 可以压缩下载体积
  • 响应缓存可以直接避免重复请求
  • 会从很多常用的连接问题中自动恢复
  • 如果您的服务器配置了多个IP地址, 当第一个IP连接失败的时候, OKHttp会自动尝试下一个IP OKHttp还处理了代理服务器问题和SSL握手失败问题

OKHttp的同步GET使用步骤:

第一步:添加依赖

implementation("com.squareup.okhttp3:okhttp:4.10.0")

第二步:设置网络权限

AndroidManifest.xml添加Internet

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

第三步:进行网络请求

  1. 创建线程
  2. 创建客户端
  3. 创建请求  
  4. 使用客户端发送请求
  5. 处理返回结果
new Thread(new Runnable() {
@Override
public void run() {
// 创建客户端
OkHttpClient client = new OkHttpClient();
// 创建请求
Request request = new Request.Builder()
.url("https://api.vvhan.com/api/mobil.girl?type=json")
.build();
// 使用客户端发送请求
try (Response response = client.newCall(request).execute()) {
result = response.body().string();
Log.i("result", result);
handler.sendEmptyMessage(0x111);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();

第四步:Handler

private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if(msg.what == 0x111) {
try {
JSONObject object = new JSONObject(result);
String imgurl = object.getString("imgurl");
Glide.with(MainActivity.this).load(imgurl).into(iv_show);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};

OKHTTP的异步GET使用步骤

第一步:添加依赖

implementation("com.squareup.okhttp3:okhttp:4.10.0")

第二步:设置网络权限

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

第三步:进行网络请求

  1. 创建客户端
  2. 创建请求
  3. 使用客户端发送异步请求
  4. 创建回调方法
  5. 处理返回结果
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://api.vvhan.com/api/mobil.girl?type=json")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.i("onFailure","fail");
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response)
throws IOException {
result = response.body().string();
handler.sendEmptyMessage(0x111);
Log.i("onResponse", result);
}
});

第四步:Handler

private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if(msg.what == 0x111) {
try {
JSONObject object = new JSONObject(result);
String imgurl = object.getString("imgurl");
Glide.with(MainActivity.this).load(imgurl).into(iv_show);
} catch (JSONException e) {
e.printStackTrace();
}
}
}

OKHTTP的同步POST使用步骤

第一步:添加依赖

implementation("com.squareup.okhttp3:okhttp:4.10.0")

第二步:设置网络权限

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

第三步:进行网络请求

  1. 创建线程
  2. 创建客户端
  3. 构建请求体,将传递参数放到请求体中
  4. 创建请求
  5. 使用客户端发送请求
  6. 处理返回结果
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();
MediaType mediaType =
MediaType.Companion.parse("application/json;charset=utf-8");
RequestBody stringBody = RequestBody.Companion.create(param,
mediaType);
Request request = new Request.Builder()
.url("http://192.168.17.181:8080/TestWeb_war_exploded/login")
.post(stringBody)
.build();
try (Response response = client.newCall(request).execute()){
result = response.body().string();
handler.sendEmptyMessage(0x111);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();

第四步:Handler

private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 0x111) {
Toast.makeText(LoginActivity.this, result,
Toast.LENGTH_SHORT).show();
}
}
};

OKHTTP的异步POST使用步骤

第一步:添加依赖

implementation("com.squareup.okhttp3:okhttp:4.10.0")

第二步:设置网络权限

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

第三步:进行网络请求

  1. 创建客户端
  2. 构建请求体,将传递参数放到请求体中
  3. 创建请求
  4. 使用客户端发送请求
  5. 创建回调方法
  6. 处理返回结果
OkHttpClient client = new OkHttpClient();
ediaType type = MediaType.Companion.parse("application/json;charset=utf8");
RequestBody requestBody = RequestBody.Companion.create(param, type);
Request request = new Request.Builder()
.url("http://192.168.17.181:8080/TestWeb_war_exploded/login")
.post(requestBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.e("onFailure","fail");
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response
response) throws IOException {
result = response.body().string();
handler.sendEmptyMessage(0x111);
}
});

第四步:Handler

private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 0x111) {
Toast.makeText(LoginActivity.this, result,
Toast.LENGTH_SHORT).show();
}
}
};

总结:

  1. 同步需要开启线程,异步不需要开启线程
  2. 同步和异步都需要跳转到UI线程修改UI

Retrofit

准确来说,Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。

Retrofit的使用 (异步GET)

添加Retrofit库的依赖

implementation("com.squareup.okhttp3:okhttp:4.10.0")
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'

添加网络权限

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

创建接收服务器返回数据的类

package com.hopu.networkdemo.model;
public class PhoneAddress {
private boolean success;
private String tel;
private Info info;
public static class Info {
private String local;
private String duan;
private String type;
private String yys;
private String bz;
}
//定义输出返回数据的方法
public void show(){
System.out.println(success);
System.out.println(tel);
System.out.println(info.local);
System.out.println(info.duan);
System.out.println(info.type);
System.out.println(info.yys);
System.out.println(info.bz);
}}

创建用于描述网络请求的接口

// https://api.vvhan.com/api/phone?tel=13145211010
public interface GetRequest_Interface {
@GET("api/phone?tel=13145211010")
Call<PhoneAddress> getCall();
}

创建Retrofit实例

创建网络请求接口实例

发送网络请求

处理返回结果

//步骤4:创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.vvhan.com/") // 设置 网络请求 Url
.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入
依赖)
.build();
// 步骤5:创建 网络请求接口 的实例
GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);
//对 发送请求 进行封装
Call<PhoneAddress> call = request.getCall();
//步骤6:发送网络请求(异步)
call.enqueue(new Callback<PhoneAddress>() {
//请求成功时回调
@Override
public void onResponse(Call<PhoneAddress> call, Response<PhoneAddress>
response) {
// 步骤7:处理返回的数据结果
response.body().show();
}
//请求失败时回调
@Override
public void onFailure(Call<PhoneAddress> call, Throwable throwable) {
System.out.println("连接失败");
}
});

Retrofit的使用(异步POST)

添加Retrofit库的依赖

implementation("com.squareup.okhttp3:okhttp:4.10.0")
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'

添加网络权限

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

创建接收服务器返回数据的类

public class LoginInfo {
private int success;
private String info;
@Override
public String toString() {
return "LoginInfo{" +
"success=" + success +
", info='" + info + '\'' +
'}';
}
}

创建用于描述网络请求的接口 (接收请求体)

public interface PostRequest_Interface {
@POST("login")
Call<LoginInfo> login(@Body RequestBody requestBody);
}

创建Retrofit实例

创建网络请求接口实例

发送网络请求

处理返回结果

// 实例化retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.17.181:8080/TestWeb_war_exploded/")
.addConverterFactory(GsonConverterFactory.create())
.build();
// 实例接口
PostRequest_Interface request =
retrofit.create(PostRequest_Interface.class);
// 构建请求体
ediaType type = MediaType.Companion.parse("application/json;charset=utf8");
RequestBody body = RequestBody.Companion.create(param, type);
// 封装请求
Call<LoginInfo> call = request.login(body);
call.enqueue(new Callback<LoginInfo>() {
@Override
public void onResponse(Call<LoginInfo> call, Response<LoginInfo>
response) {
Log.i("onResponse", response.body().toString());
}
@Override
public void onFailure(Call<LoginInfo> call, Throwable t) {
Log.i("onFailure","失败");
}
});

Retrofit+OkHTTP+RecycleView的实现步骤

第一步: 创建项目

第二步:导入依赖

implementation "com.github.bumptech.glide:glide:4.12.0"
implementation("com.squareup.okhttp3:okhttp:4.10.0")
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'

第三步:添加网络权限

<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"
android:orientation="vertical"
android:padding="15dp"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_news"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

第五步:创建子布局 news_item.xml

<?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"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardCornerRadius="5dp"
app:cardElevation="5dp"
android:layout_height="200dp">
<RelativeLayout
android:padding="5dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageViewandroid:id="@+id/news_pic"
android:scaleType="fitXY"
android:layout_width="200dp"
android:layout_height="190dp"
app:srcCompat="@drawable/ic_launcher_background" />
<TextView
android:id="@+id/news_title"
android:layout_toRightOf="@id/news_pic"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:text="TextView" />
<TextView
android:id="@+id/news_desc"
android:layout_below="@id/news_title"
android:layout_alignStart="@id/news_title"
android:layout_marginTop="40dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="5"
android:text="TextView" />
</RelativeLayout>
</androidx.cardview.widget.CardView>

第六步:创建实体类

public class News {
        private boolean success;
        private String title;
        private List<Data> data;
        private String subtitle;
        private String update_time;
        public static class Data{
            private String title;
            private String pic;
            private String hot;
            public Data(String title, String pic, String hot) {
                this.title = title;
                this.pic = pic;
                this.hot = hot;
            }

            public String getTitle() {
                return title;
            }

            public String getPic() {
                return pic;
            }

            public String getHot() {
                return hot;
            }

            @Override
            public String toString() {
                return "data{" +
                        "title:'" + title + '\'' +
                        ", pic='" + pic + '\'' +
                        ", hot='" + hot + '\'' +
                        '}';
            }
        }


    @Override
    public String toString() {
        return "News{" +
                "success=" + success +
                ", title='" + title + '\'' +
                ", data=" + data +
                ", subtitle='" + subtitle + '\'' +
                ", update_time='" + update_time + '\'' +
                '}';
    }

    public News(boolean success, String title, List<Data> data, String subtitle, String update_time) {
        this.success = success;
        this.title = title;
        this.data = data;
        this.subtitle = subtitle;
        this.update_time = update_time;
    }

    public boolean isSuccess() {
        return success;
    }

    public String getTitle() {
        return title;
    }

    public List<Data> getData() {
        return data;
    }

    public String getSubtitle() {
        return subtitle;
    }

    public String getUpdate_time() {
        return update_time;
    }
}

第七步:创建适配器

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {
    List<News.Data> list;
    public void setList(List<News.Data> list){
        this.list=list;
        notifyDataSetChanged();
    }
   /* public NewsAdapter(List<News.Data> list){
        this.list=list;
    }*/
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        News.Data news = list.get(position);
        holder.tv_news.setText(news.getTitle());
        Glide.with(holder.view).load(news.getPic()).into(holder.im_news);
        holder.tv_hot.setText(news.getHot());
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView tv_news,tv_hot;
        private ImageView im_news;
        View view;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            view=itemView;
            tv_news=itemView.findViewById(R.id.tv_news);
            im_news=itemView.findViewById(R.id.im_news);
            tv_hot=itemView.findViewById(R.id.tv_hot);
        }
    }
}

第八步:设置适配器

public class MainActivity extends AppCompatActivity {
    List<News.Data> list=new ArrayList<>();
    RecyclerView rv_news;
    NewsAdapter newsAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rv_news = findViewById(R.id.rv_news);
        newsAdapter= new NewsAdapter();
        LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
        rv_news.setLayoutManager(layoutManager);
        rv_news.setAdapter(newsAdapter);
        retrofit();
    }

第九步:进行网络请求

  • 创建请求接口
  • 开始网络请求
  • 处理返回结果
    private void retrofit() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.vvhan.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        //创建网络接口实例
        GetReqiest_news request = retrofit.create(GetReqiest_news.class);
        Call<News> call = request.getCall();
        call.enqueue(new Callback<News>() {
            @Override
            public void onResponse(Call<News> call, Response<News> response) {
                list = response.body().getData();
                newsAdapter.setList(list);

            }
            @Override
            public void onFailure(Call<News> call, Throwable t) {
                Log.d("值", "请求失败");
            }
        });

    }

RxJAVA

RxJAVA简介

响应式编程

RxJava 是一种响应式编程,来创建基于事件的异步操作库。基于事件流的链式调用、逻辑清晰简 洁。

RxJava 我的理解是将事件从起点(上游)流向终点(下游),中间有很多卡片对数据进操作并传 递,每个卡片获取上一个卡片传递下来的结果然后对事件进行处理然后将结果传递给下一个卡片, 这样事件就从起点通过卡片一次次传递直到流向终点。

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

RxJava原理理解

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

 RxJava实例

// 1. 建立被观察者 Observable 对象
Observable<Integer> observable = Observable.create(new
ObservableOnSubscribe<Integer>() {
// 2. 在复写的subscribe()里定义须要发送的事件
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws
Exception {
// 经过 ObservableEmitter类对象产生事件并通知观察者
// ObservableEmitter类介绍
// a. 定义:事件发射器
// b. 做用:定义须要发送的事件 & 向观察者发送事件
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
});
// 步骤2:建立观察者 Observer 并 定义响应事件行为
Observer<Integer> observer = new Observer<Integer>() {
// 经过复写对应方法来 响应 被观察者
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "开始采用subscribe链接");
}
// 默认最早调用复写的 onSubscribe()
@Override
public void onNext(Integer value) {
Log.d(TAG, "对Next事件"+ value +"做出响应" );
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "对Error事件做出响应");
}
@Override
public void onComplete() {
Log.d(TAG, "对Complete事件做出响应");
}
};
// 步骤3:经过订阅(subscribe)链接观察者和被观察者
// 即 顾客找到服务员 - 点菜 - 服务员下单到厨房 - 厨房烹调
observable.subscribe(observer);

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

第一步: 创建项目

第二步:导入依赖

//for rxjava
implementation 'io.reactivex.rxjava3:rxjava:3.0.0'
//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"
android:orientation="vertical"
tools:context=".MainActivity2">
<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="120dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardCornerRadius="5dp"
android:layout_marginTop="10dp"
app:cardElevation="5dp">
<RelativeLayout
android:padding="5dp"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:scaleType="fitXY"
android:id="@+id/news_pic"
android:layout_width="110dp"
android:layout_height="110dp"
app:srcCompat="@drawable/ic_launcher_background" />
<TextView
android:id="@+id/news_title"
android:layout_toEndOf="@id/news_pic"
android:layout_marginStart="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="TextView" />
<TextView
android:id="@+id/news_desc"
android:layout_below="@id/news_title"
android:layout_alignStart="@id/news_title"
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</RelativeLayout>
</androidx.cardview.widget.CardView>

第六步:创建实体类

public class News {
    private List<Data> 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 int getIndex() {
            return index;
        }

        public String getTitle() {
            return title;
        }

        public String getDesc() {
            return desc;
        }

        public String getPic() {
            return pic;
        }

        public String getHot() {
            return hot;
        }

        public String getUrl() {
            return url;
        }

        public String getMobilUrl() {
            return mobilUrl;
        }

        public Data(int index, String title, String desc, String pic, String hot, String url, String mobilUrl) {
            this.index = index;
            this.title = title;
            this.desc = desc;
            this.pic = pic;
            this.hot = hot;
            this.url = url;
            this.mobilUrl = mobilUrl;
        }
    }

    public List<Data> getData() {
        return data;
    }

    public News(List<Data> data) {
        this.data = data;
    }
}

第七步:创建适配器

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {
     List<News.Data> list;
    public void setresult(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);
        return new ViewHolder(view);
    }

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

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

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

第八步:设置适配器

public class NewsActivity extends AppCompatActivity {
    private RecyclerView rv_news;
    private NewsAdapter newsAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news);
        rv_news=findViewById(R.id.rv_news);
        newsAdapter=new NewsAdapter();
        LinearLayoutManager layoutManager=new LinearLayoutManager(this);
        rv_news.setLayoutManager(layoutManager);
        rv_news.setAdapter(newsAdapter);
        retrofit();
    }

第九步:进行网络请求

    private void retrofit() {
        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("https://api.vvhan.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        News_Interface request = retrofit.create(News_Interface.class);
        Observable<News> call = request.getCall();
        call.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<News>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

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

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

                    }

                    @Override
                    public void onComplete() {
                        Log.i("complete","连接完成");

                    }
                });



    }

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OkHttp 是一个用于进行网络请求的开源框架,它基于 Java 的 HttpURLConnection 类进行封装,提供了更简单、更强大的网络请求功能。 Retrofit2 是一个基于 OkHttp 的网络请求框架,它通过注解和反射的方式,将网络请求接口转换成具体的网络请求动作。同时,Retrofit2 也提供了许多强大的功能,例如请求头、请求体的自定义、请求解析器的设置、请求拦截器等。 RxJava2 是一个响应式编程框架,它提供了一种更优雅和简洁的处理异步操作的方式。通过使用观察者模式和链式调用的方式,我们可以简化对多个异步操作的管理和处理,同时提供了丰富的操作符,用于处理和组合异步数据流。 MVVM 是一种用于设计和实现用户界面的架构模式。它将应用程序的界面逻辑和数据逻辑分开,并通过数据绑定机制实现二者之间的通信。在 MVVM 中,Model 层负责数据的获取和处理,View 层负责界面的显示和用户输入的处理,而 ViewModel 则负责衔接二者之间的通信。 通过将 OkHttpRetrofit2、RxJava2 和 MVVM 结合使用,我们可以构建出一个功能强大、性能优秀、响应迅速的网络请求和数据处理框架OkHttp 提供了稳定可靠的网络请求功能,Retrofit2 则提供了简单易用的网络接口转换方式,RxJava2 则提供了异步数据处理和链式调用的能力,而 MVVM 则提供了一种清晰的架构模式,使得我们可以更好地组织应用程序的逻辑。总的来说,这些技术和框架的结合能够让我们在开发中更加高效、稳定和灵活。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值