IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 网络连接框架 OKHTTP Retrofit RxJAVA -> 正文阅读

[移动开发]网络连接框架 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","连接完成");

                    }
                });



    }

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:17:25  更:2022-08-19 19:17:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 4:32:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码