HttpURLConnection
HttpURLConnection简介:
在JDK的 java.net 包中已经提供了访问HTTP协议的基本功能的类:HttpURLConnection。 HttpURLConnection是Java的标准类,它继承自URLConnection,可用于向指定网站发送GET请求、 POST请求
使用步骤:
设置网络权限
在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.INTERNET"/>
和RecycleView的结合使用
第一步:在activity_main.xml中添加RecycleView
<?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=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_1"
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="200dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:elevation="5dp"
app:cardCornerRadius="5dp">
<RelativeLayout
android:layout_margin="5dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="190dp"
android:layout_height="190dp"
android:id="@+id/iv_1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_1"
android:layout_alignRight="@id/iv_1"
android:layout_centerInParent="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_2"
android:layout_below="@id/tv_1"
android:layout_alignStart="@id/tv_1"/>
</RelativeLayout>
</androidx.cardview.widget.CardView>
第三步:创建实体类
package com.hp.androidday17zuoye;
public class News {
String title;
String desc;
String pic;
public News(String title, String desc, String pic) {
this.title = title;
this.desc = desc;
this.pic = pic;
}
public String getTitle() {
return title;
}
public String getDesc() {
return desc;
}
public String getPic() {
return pic;
}
}
第四步:创建适配器
package com.hp.androidday17zuoye;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import java.util.List;
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolper> {
List<News> list;
public NewsAdapter(List<News> list){
this.list=list;
}
@NonNull
@Override
public ViewHolper onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.demo1,parent,false);
ViewHolper viewHolper=new ViewHolper(view);
return viewHolper;
}
@Override
public void onBindViewHolder(@NonNull ViewHolper holder, int position) {
News news= list.get(position);
holder.tv_1.setText(news.getTitle());
holder.tv_2.setText(news.getDesc());
Glide.with(holder.view).load(news.getPic()).into(holder.iv_1);
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolper extends RecyclerView.ViewHolder {
ImageView iv_1;
TextView tv_1;
TextView tv_2;
View view;
public ViewHolper(@NonNull View itemView) {
super(itemView);
this.view=itemView;
iv_1=itemView.findViewById(R.id.iv_1);
tv_1=itemView.findViewById(R.id.tv_1);
tv_2=itemView.findViewById(R.id.tv_2);
}
}
}
第五步:声明RecycleView
public class MainActivity extends AppCompatActivity {
RecyclerView rv_1;
List<News> list=new ArrayList<>();
String result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDate();
rv_1=findViewById(R.id.rv_1);
}
第六步:开始进行网络编程
封装HttpURLConnection
package com.hp.androidday17zuoye;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class NewsGet {
public static String doget(String url){
String msg="";
try {
URL url1=new URL(url);
HttpURLConnection connection= (HttpURLConnection) url1.openConnection();
connection.setDoOutput(false);
connection.setDoInput(true);
connection.setUseCaches(true);
connection.setRequestMethod("GET");
connection.setInstanceFollowRedirects(true);
connection.setConnectTimeout(3000);
int code = connection.getResponseCode();
if (code == 200) {
BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line=reader.readLine())!=null){
msg +=line;
}
reader.close();
}
connection.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return msg;
}
}
private void initDate() {
new Thread(new Runnable() {
@Override
public void run() {
result=NewsGet.doget("https://api.vvhan.com/api/hotlist? type=36Ke");
handler.sendEmptyMessage(0x111);
}
}).start();
}
第七步:传递数据,数据解析
Handler handler=new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 0x111) {
try {
JSONObject jsonObject=new JSONObject(result);
JSONArray jsonArray = jsonObject.getJSONArray("data");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
String title = jsonObject1.getString("title");
String desc = jsonObject1.getString("desc");
String pic = jsonObject1.getString("pic");
News news=new News(title,desc,pic);
list.add(news);
}
} catch (JSONException e) {
e.printStackTrace();
}
NewsAdapter newsAdapter=new NewsAdapter(list);
LinearLayoutManager layoutManager=new LinearLayoutManager(MainActivity.this);
rv_1.setLayoutManager(layoutManager);
rv_1.setAdapter(newsAdapter);
}
}
};
第八步:当数据完毕后,给RecycleView设置适配器
package com.hp.androidday17zuoye;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
RecyclerView rv_1;
List<News> list=new ArrayList<>();
String result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDate();
rv_1=findViewById(R.id.rv_1);
}
private void initDate() {
new Thread(new Runnable() {
@Override
public void run() {
result=NewsGet.doget("https://api.vvhan.com/api/hotlist? type=36Ke");
handler.sendEmptyMessage(0x111);
}
}).start();
}
Handler handler=new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 0x111) {
try {
JSONObject jsonObject=new JSONObject(result);
JSONArray jsonArray = jsonObject.getJSONArray("data");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
String title = jsonObject1.getString("title");
String desc = jsonObject1.getString("desc");
String pic = jsonObject1.getString("pic");
News news=new News(title,desc,pic);
list.add(news);
}
} catch (JSONException e) {
e.printStackTrace();
}
NewsAdapter newsAdapter=new NewsAdapter(list);
LinearLayoutManager layoutManager=new LinearLayoutManager(MainActivity.this);
rv_1.setLayoutManager(layoutManager);
rv_1.setAdapter(newsAdapter);
}
}
};
}
OKHttp
OKHttp是什么:
OKHttp是一个网络请求开源项目,Android网络请求轻量级框架,支持文件上传与下载,支持https。
导入依赖build.gradle
implementation("com.squareup.okhttp3:okhttp:4.10.0")
OKHttp的同步GET使用步骤:
第一步:添加依赖
implementation("com.squareup.okhttp3:okhttp:4.10.0")
第二步:设置网络权限
<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://blog.csdn.net/"https://api.vvhan.com/api/mobil.girl?type=json")
.build();
try(Response response=client.newCall(request).execute()) {
result=response.body().string();
handler.sendEmptyMessage(0x111);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
四步:Handler
Handler handler=new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 0x111) {
try {
JSONObject jsonObject=new JSONObject(result);
String imgurl = jsonObject.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://blog.csdn.net/"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) {
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
result=response.body().string();
handler.sendEmptyMessage(0x111);
}
});
四步:Handler
Handler handler=new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 0x111) {
try {
JSONObject jsonObject=new JSONObject(result);
String imgurl = jsonObject.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"/>
第三步:进行网络请求
1. 创建线程 2. 创建客户端 3. 构建请求体,将传递参数放到请求体中 4. 创建请求 5. 使用客户端发送请求 6. 处理返回结果
public void onClick(View view) {
String s = te_username.getText().toString();
String s1 = te_password.getText().toString();
JSONObject object=new JSONObject();
try {
object.put("username",s);
object.put("password",s1);
param=object.toString();
} catch (JSONException e) {
e.printStackTrace();
}
synchro(param);
}
});
}
private void synchro(String param) {
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client=new OkHttpClient();
MediaType mediaType=MediaType.Companion.parse("application/json;charset=utf-8");
RequestBody requestBody=RequestBody.Companion.create(param,mediaType);
Request request=new Request.Builder()
.url(https://blog.csdn.net/"http://192.168.17.181:8080/TestWeb_war_exploded/login")
.post(requestBody)
.build();
try(Response response=client.newCall(request).execute()) {
result=response.body().string();
handler.sendEmptyMessage(0x111);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
第四步:Handler
Handler handler=new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 0x111) {
try {
JSONObject jsonObject=new JSONObject(result);
String imgurl = jsonObject.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"/>
第三步:进行网络请求
1. 创建客户端 2. 构建请求体,将传递参数放到请求体中 3. 创建请求 4. 使用客户端发送请求 5. 创建回调方法 6. 处理返回结果
@Override
public void onClick(View view) {
String s = te_username.getText().toString();
String s1 = te_password.getText().toString();
JSONObject jsonObject=new JSONObject();
try {
jsonObject.put("username",s);
jsonObject.put("password",s1);
param=jsonObject.toString();
} catch (JSONException e) {
e.printStackTrace();
}
synchro2(param);
}
private void synchro2(String param) {
OkHttpClient client=new OkHttpClient();
MediaType mediaType=MediaType.Companion.parse("application/json;charset=utf-8");
RequestBody requestBody=RequestBody.Companion.create(param,mediaType);
Request request=new Request.Builder()
.url(https://blog.csdn.net/"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) {
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
result=response.body().string();
handler.sendEmptyMessage(0x111);
}
});
}
第四步:Handler
Handler handler=new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 0x111) {
try {
JSONObject jsonObject=new JSONObject(result);
String imgurl = jsonObject.getString("imgurl");
Glide.with(MainActivity.this).load(imgurl).into(iv_show);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
同步和异步的小结
1.同步需要开启线程,异步不需要开启线程
2.同步和异步都需要跳转到UI线程修改UI
Retrofit
Retrofit是什么:
Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。
Retrofit的使用步骤(异步GET)
1 添加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'
2 添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
3 创建接收服务器返回数据的类
package com.hp.androidretrofit_zuoye.model;
import java.util.List;
public class RetrofitDemo1 {
private List<Data> data;
public RetrofitDemo1(List<Data> data) {
this.data = data;
}
public List<Data> getData() {
return data;
}
public void setData(List<Data> data) {
this.data = data;
}
public RetrofitDemo1() {
}
public static class Data{
String title;
String desc;
String pic;
public Data(String title, String desc, String pic) {
this.title = title;
this.desc = desc;
this.pic = pic;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
@Override
public String toString() {
return "Data{" +
"title='" + title + '\'' +
", desc='" + desc + '\'' +
", pic='" + pic + '\'' +
'}';
}
}
@Override
public String toString() {
return "RetrofitDemo1{" +
"data=" + data +
'}';
}
}
4 创建用于描述网络请求的接口
package com.hp.androidretrofit_zuoye;
import com.hp.androidretrofit_zuoye.model.RetrofitDemo1;
import io.reactivex.Observable;
import retrofit2.Call;
import retrofit2.http.GET;
public interface Retrofit_Demo1 {
@GET("api/hotlist?type=baiduRD")
Call<RetrofitDemo1> getcall();
}
5 创建Retrofit实例
6 创建网络请求接口实例
7 发送网络请求
8 处理返回结果
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("https://api.vvhan.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
Retrofit_Demo1 retrofit_demo1 = retrofit.create(Retrofit_Demo1.class);
Call<RetrofitDemo1> call = retrofit_demo1.getcall();
call.enqueue(new Callback<RetrofitDemo1>() {
@Override
public void onResponse(Call<RetrofitDemo1> call, Response<RetrofitDemo1> response) {
demo1Adapter.setList(response.body().getData());
}
@Override
public void onFailure(Call<RetrofitDemo1> call, Throwable t) {
}
});
}
Retrofit的使用步骤(异步GET)
1 添加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'
2 添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
3 创建接收服务器返回数据的类
package com.hp.androidretrofit_zuoye.model;
import java.util.List;
public class RetrofitDemo2 {
List<Data> data;
public RetrofitDemo2(List<Data> data) {
this.data = data;
}
public List<Data> getData() {
return data;
}
public void setData(List<Data> data) {
this.data = data;
}
public RetrofitDemo2() {
}
public static class Data{
String pic;
public Data(String pic) {
this.pic = pic;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
}
}
4 创建用于描述网络请求的接口
package com.hp.androidretrofit_zuoye;
import com.hp.androidretrofit_zuoye.model.RetrofitDemo2;
import io.reactivex.Observable;
import retrofit2.Call;
import retrofit2.http.GET;
public interface Retrofit_Demo2 {
@GET("api/hotlist?type=zhihuHot")
Call<RetrofitDemo2> getcall();
}
5 创建Retrofit实例
6 创建网络请求接口实例
7 发送网络请求
8 处理返回结果
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("https://api.vvhan.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
Retrofit_Demo2 retrofit_demo2 = retrofit.create(Retrofit_Demo2.class);
MediaType type = MediaType.Companion.parse("application/json;charset=utf8");
RequestBody body = RequestBody.Companion.create(param, type);
Call<RetrofitDemo2> call = retrofit_demo2.getcall();
call.enqueue(new Callback<RetrofitDemo2>() {
@Override
public void onResponse(Call<RetrofitDemo2> call, Response<RetrofitDemo2> response) {
demo2Adapter.setList(response.body().getData());
}
@Override
public void onFailure(Call<RetrofitDemo2> call, Throwable t) {
}
});
RxJAVA
什么是RxJava
RxJava本质上是一个异步操作库,是一个能让你用极其简洁的逻辑去处理繁琐复杂任 务的异步事件库。
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=".MainActivity"
android:orientation="vertical"
android:padding="20dp">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/rv_show"/>
<androidx.viewpager2.widget.ViewPager2
android:layout_width="match_parent"
android:layout_height="150dp"
android:id="@+id/vp_1"/>
</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="300dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:elevation="5dp"
app:cardCornerRadius="5dp"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp">
<ImageView
android:layout_width="200dp"
android:layout_height="290dp"
android:id="@+id/iv_1"
android:scaleType="fitXY"/>
<TextView
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="title"
android:id="@+id/tv_1"
android:layout_toRightOf="@id/iv_1"
/>
<TextView
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hot"
android:id="@+id/tv_2"
android:layout_toRightOf="@id/iv_1"
android:layout_below="@id/tv_1"/>
</RelativeLayout>
</androidx.cardview.widget.CardView>
第六步:创建实体类
package com.hp.androidretrofit_zuoye.model;
import java.util.List;
public class RetrofitDemo1 {
private List<Data> data;
public RetrofitDemo1(List<Data> data) {
this.data = data;
}
public List<Data> getData() {
return data;
}
public void setData(List<Data> data) {
this.data = data;
}
public RetrofitDemo1() {
}
public static class Data{
String title;
String desc;
String pic;
public Data(String title, String desc, String pic) {
this.title = title;
this.desc = desc;
this.pic = pic;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
@Override
public String toString() {
return "Data{" +
"title='" + title + '\'' +
", desc='" + desc + '\'' +
", pic='" + pic + '\'' +
'}';
}
}
@Override
public String toString() {
return "RetrofitDemo1{" +
"data=" + data +
'}';
}
}
第七步:创建适配器
package com.hp.androidretrofit_zuoye.Adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.hp.androidretrofit_zuoye.R;
import com.hp.androidretrofit_zuoye.model.RetrofitDemo1;
import java.util.List;
public class Demo1Adapter extends RecyclerView.Adapter<Demo1Adapter.ViewHolper> {
List<RetrofitDemo1.Data> list;
public void setList( List<RetrofitDemo1.Data> list){
this.list=list;
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolper onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.show,parent,false);
ViewHolper viewHolper=new ViewHolper(view);
return viewHolper;
}
@Override
public void onBindViewHolder(@NonNull ViewHolper holder, int position) {
RetrofitDemo1.Data data1= list.get(position);
Glide.with(holder.view).load(data1.getPic()).into(holder.iv_1);
holder.tv_1.setText(data1.getTitle());
holder.tv_2.setText(data1.getDesc());
}
@Override
public int getItemCount() {
return list==null ? 0: list.size();
}
public class ViewHolper extends RecyclerView.ViewHolder {
ImageView iv_1;
TextView tv_1,tv_2;
View view;
public ViewHolper(@NonNull View itemView) {
super(itemView);
view=itemView;
iv_1=itemView.findViewById(R.id.iv_1);
tv_1=itemView.findViewById(R.id.tv_1);
tv_2=itemView.findViewById(R.id.tv_2);
}
}
}
第八步:设置适配器
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv_show=findViewById(R.id.rv_show);
vp_1=findViewById(R.id.vp_1);
//
retrofit();
LinearLayoutManager layoutManager=new LinearLayoutManager(MainActivity.this);
layoutManager.setOrientation(RecyclerView.HORIZONTAL);
demo1Adapter=new Demo1Adapter();
rv_show.setAdapter(demo1Adapter);
rv_show.setLayoutManager(layoutManager);
第九步:进行网络请求
1. 创建请求接口 2. 开始网络请求 3. 处理返回结果
private void retrofit() {
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("https://api.vvhan.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
Retrofit_Demo1 retrofit_demo1 = retrofit.create(Retrofit_Demo1.class);
Observable<RetrofitDemo1> observable = retrofit_demo1.getcall();
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<RetrofitDemo1>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(RetrofitDemo1 retrofitDemo1) {
demo1Adapter.setList(retrofitDemo1.getData());
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
这篇博客详细介绍了Android网络编程,包括使用HttpURLConnection的基础操作,同步与异步的GET和POST请求,以及OKHttp的使用。进一步探讨了Retrofit异步GET请求的步骤,并结合RxJava实现网络请求与RecycleView的集成。通过这些内容,读者可以掌握Android应用中常见的网络请求技术。
1359

被折叠的 条评论
为什么被折叠?



