Android网络编程

这篇博客详细介绍了Android网络编程,包括使用HttpURLConnection的基础操作,同步与异步的GET和POST请求,以及OKHttp的使用。进一步探讨了Retrofit异步GET请求的步骤,并结合RxJava实现网络请求与RecycleView的集成。通过这些内容,读者可以掌握Android应用中常见的网络请求技术。

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() {

                    }
                });
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值