1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Android OkHttp+Retrofit+Rxjava+Hilt 的网络请求封装

Android OkHttp+Retrofit+Rxjava+Hilt 的网络请求封装

时间:2021-03-05 19:15:12

相关推荐

Android OkHttp+Retrofit+Rxjava+Hilt 的网络请求封装

今天给大家简单的封装一个现在比较流行的网络请求框架

第一步是导入我们所需要的依赖还需要在android {}闭包下添加一个

buildFeatures{viewBinding true}

implementation "io.reactivex.rxjava2:rxjava:2.2.6" // 必要rxjava依赖implementation "io.reactivex.rxjava2:rxandroid:2.1.0" // 必要rxandrroid依赖,切线程时需要用到implementation 'com.squareup.retrofit2:retrofit:2.8.1' // 必要retrofit依赖implementation 'com.squareup.retrofit2:converter-gson:2.8.1' // 必要依赖,解析json字符所用implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0' //非必要依赖,log依赖,如果需要打印OkHttpLog需要添加implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0' // 必要依赖,和rxjava结合必须用到implementation 'com.google.dagger:hilt-android:2.40.1'annotationProcessor 'com.google.dagger:hilt-compiler:2.40.1'

然后在app下的build.gradle中添加

apply plugin: 'dagger.hilt.android.plugin'

在项目的build.gradle中添加

repositories {google()mavenCentral()} dependencies {classpath 'com.google.dagger:hilt-android-gradle-plugin:2.40.1'}allprojects {repositories {google()mavenCentral()jcenter() // Warning: this repository is going to shut down soon}}

第二步,创建一个network包,然后在包下创建一个NetWorkcarrier 用来先做一个简单的OkHttp+Retrofit的封装

package work;import workdemo.utils.Log;import java.io.UnsupportedEncodingException;import .URLDecoder;import java.util.concurrent.TimeUnit;import .ssl.TrustManager;import okhttp3.OkHttpClient;import okhttp3.logging.HttpLoggingInterceptor;import retrofit2.Retrofit;import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;import retrofit2.converter.gson.GsonConverterFactory;/*** @author 浩楠* @date /8/5* <p>* _ _ __ ____ _ _ _* / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___* / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \* / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) |* /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/*/public class NetWorkcarrier {private static volatile NetWorkcarrier instances;private static volatile OkHttpClient okHttpClient;private static volatile Retrofit retrofit;/*** 单例* @return*/public static NetWorkcarrier getInstance() {if (instances == null) {synchronized (NetWorkcarrier.class) {if (instances == null) {instances = new NetWorkcarrier();}}}return instances;}private static int TIME_OUT = 30; //30秒超时断开连接private OkHttpClient initClient() {if (okHttpClient == null) {synchronized (NetWorkcarrier.class) {if (okHttpClient == null) {//请求日志打印HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(message -> {try {Log.e(URLDecoder.decode(message, "utf-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();Log.e(message);}});loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);/*** 创建OkHttpClient对象,构建一个网络类型的实例,一般会将所有的网络请求使用同一个单例对象。(如果OkHttpClient使用默认,可不设置)*/okHttpClient = new OkHttpClient.Builder().sslSocketFactory(new NetworkSSL(TrustManager.trustAllCert), TrustManager.trustAllCert).connectTimeout(TIME_OUT, TimeUnit.SECONDS).addInterceptor(loggingInterceptor).readTimeout(TIME_OUT, TimeUnit.SECONDS).writeTimeout(TIME_OUT, TimeUnit.SECONDS).build();}}}return okHttpClient;}public Retrofit initRetrofit() {if (retrofit == null) {synchronized (NetWorkcarrier.class) {if (retrofit == null) {/*** 创建Retrofit对象,构建一个网络请求的载体对象,在build的时候有非常多的初始化内容,如设置OkHttpClient、设置请求的url,添加数据转换器等。*/retrofit = new Retrofit.Builder().client(initClient())//选填.baseUrl(Api.BASE_URL)//必填.addConverterFactory(GsonConverterFactory.create())//选填(数据转换器,解析).build();}}}return retrofit;}public Retrofit initRetrofitRxJava() {if (retrofit == null) {synchronized (NetWorkcarrier.class) {if (retrofit == null) {//注释2:设置Retrofitretrofit = new Retrofit.Builder().client(initClient())//选填.baseUrl(Api.BASE_URL)//必填.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//新增网络请求适配器.addConverterFactory(GsonConverterFactory.create())//选填(数据转换器,解析).build();}}}return retrofit;}}

这个时候你的代码应该会有三个错误,第一个是Log的错误,另一个是api的错误 、最后一个是NetworkSSL,是因为你还没有我们的代码中对应的类

这个是后你得再创建一个utils包创建一个Log类然后

package workdemo.utils;/*** @author 浩楠* @date /8/5* <p>* _ _ __ ____ _ _ _* / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___* / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \* / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) |* /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/*/public class Log {public static final String TAG_START = "-sc-";private Log() {/* cannot be instantiated */throw new UnsupportedOperationException("cannot be instantiated");}public static void e(Class<?> cla, String msg) {e(cla.getSimpleName(), msg);}public static void e(String msg) {android.util.Log.e(TAG_START, msg + "");}public static void e(String tag, String msg) {android.util.Log.e(TAG_START + tag, msg + "");}}

然后在我们的network中创建一个api包和在包里创建一个Api的接口类,不过在创建这个Api接口类之前我们要先创建一个统一的接口后台返回的结果的类,然后在network中创建一个data的包,包下创建一个ResponseData类,里面写我们的统一返回的的数据,这个是和后端的接口是保持一至的

package workdemo.data;/*** @author 浩楠* @date /8/5* <p>* _ _ __ ____ _ _ _* / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___* / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \* / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) |* /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/*统一接收后台返回的数据*/public class ResponseData<T> {private int errorCode;private String errorMsg;private T data;public int getErrorCode() {return errorCode;}public void setErrorCode(int errorCode) {this.errorCode = errorCode;}public String getErrorMsg() {return errorMsg;}public void setErrorMsg(String errorMsg) {this.errorMsg = errorMsg;}public T getData() {return data;}public void setData(T data) {this.data = data;}}

package workdemo.Api;import workdemo.bean.BannerBean;import workdemo.data.ResponseData;import java.util.List;import retrofit2.Call;import retrofit2.http.GET;/*** @author 浩楠* @date /8/5* <p>* _ _ __ ____ _ _ _* / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___* / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \* / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) |* /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/*/public interface Api {String BASE_URL = "/";//OkHttp+Retrofit@GET("banner/json")Call<ResponseData<List<BannerBean>>> BannerRetrofit();}

然后再来创建一个NetworkSSL的类和TrustManager的类和我们的NetworkModule类

package work;import android.os.Build;import java.io.IOException;import .InetAddress;import .Socket;import .UnknownHostException;import java.security.GeneralSecurityException;import java.util.Arrays;import java.util.HashSet;import java.util.LinkedList;import java.util.List;import .ssl.SSLContext;import .ssl.SSLSocket;import .ssl.SSLSocketFactory;import .ssl.X509TrustManager;/*** @author 浩楠* @date /8/5* <p>* _ _ __ ____ _ _ _* / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___* / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \* / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) |* /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/*/public class NetworkSSL extends SSLSocketFactory {private SSLSocketFactory defaultFactory;static String protocols[] = null, cipherSuites[] = null;static {try {SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket();if (socket != null) {List<String> protocols = new LinkedList<>();for (String protocol : socket.getSupportedProtocols())if (!protocol.toUpperCase().contains("SSL"))protocols.add(protocol);NetworkSSL.protocols = protocols.toArray(new String[protocols.size()]);/* set up reasonable cipher suites */if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {// choose known secure cipher suitesList<String> allowedCiphers = Arrays.asList(// TLS 1.2"TLS_RSA_WITH_AES_256_GCM_SHA384","TLS_RSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256","TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256","TLS_ECHDE_RSA_WITH_AES_128_GCM_SHA256",// maximum interoperability"TLS_RSA_WITH_3DES_EDE_CBC_SHA","TLS_RSA_WITH_AES_128_CBC_SHA",// additionally"TLS_RSA_WITH_AES_256_CBC_SHA","TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA","TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA");List<String> availableCiphers = Arrays.asList(socket.getSupportedCipherSuites());HashSet<String> preferredCiphers = new HashSet<>(allowedCiphers);preferredCiphers.retainAll(availableCiphers);HashSet<String> enabledCiphers = preferredCiphers;enabledCiphers.addAll(new HashSet<>(Arrays.asList(socket.getEnabledCipherSuites())));NetworkSSL.cipherSuites = enabledCiphers.toArray(new String[enabledCiphers.size()]);}}} catch (IOException e) {throw new RuntimeException(e);}}public NetworkSSL(X509TrustManager tm) {try {SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(null, (tm != null) ? new X509TrustManager[]{tm} : null, null);defaultFactory = sslContext.getSocketFactory();} catch (GeneralSecurityException e) {throw new AssertionError(); // The system has no TLS. Just give up.}}private void upgradeTLS(SSLSocket ssl) {if (protocols != null) {ssl.setEnabledProtocols(protocols);}if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && cipherSuites != null) {ssl.setEnabledCipherSuites(cipherSuites);}}@Overridepublic String[] getDefaultCipherSuites() {return cipherSuites;}@Overridepublic String[] getSupportedCipherSuites() {return cipherSuites;}@Overridepublic Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {Socket ssl = defaultFactory.createSocket(s, host, port, autoClose);if (ssl instanceof SSLSocket) {upgradeTLS((SSLSocket) ssl);}return ssl;}@Overridepublic Socket createSocket(String host, int port) throws IOException, UnknownHostException {Socket ssl = defaultFactory.createSocket(host, port);if (ssl instanceof SSLSocket) {upgradeTLS((SSLSocket) ssl);}return ssl;}@Overridepublic Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {Socket ssl = defaultFactory.createSocket(host, port, localHost, localPort);if (ssl instanceof SSLSocket) {upgradeTLS((SSLSocket) ssl);}return ssl;}@Overridepublic Socket createSocket(InetAddress host, int port) throws IOException {Socket ssl = defaultFactory.createSocket(host, port);if (ssl instanceof SSLSocket) {upgradeTLS((SSLSocket) ssl);}return ssl;}@Overridepublic Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {Socket ssl = defaultFactory.createSocket(address, port, localAddress, localPort);if (ssl instanceof SSLSocket) {upgradeTLS((SSLSocket) ssl);}return ssl;}}

package work;import java.security.cert.CertificateException;import .ssl.X509TrustManager;/*** @author 浩楠* @date /8/510:56.* <p>* _ _ __ ____ _ _ _* / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___* / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \* / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) |* /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/*/public class TrustManager {public static X509TrustManager trustAllCert = new X509TrustManager() {@Overridepublic void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic java.security.cert.X509Certificate[] getAcceptedIssuers() {return new java.security.cert.X509Certificate[]{};}};}

package work;import work.Api.Api;import workdemo.utils.Log;import java.io.UnsupportedEncodingException;import .URLDecoder;import java.util.concurrent.TimeUnit;import javax.inject.Singleton;import dagger.Module;import dagger.Provides;import dagger.hilt.InstallIn;import ponents.SingletonComponent;import okhttp3.OkHttpClient;import okhttp3.logging.HttpLoggingInterceptor;import retrofit2.Retrofit;import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;import retrofit2.converter.gson.GsonConverterFactory;/*** @author 浩楠* @date /8/5* <p>* _ _ __ ____ _ _ _* / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___* / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \* / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) |* /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/**/@InstallIn(SingletonComponent.class)@Modulepublic class NetworkModule {private static int TIME_OUT = 30; //30秒超时断开连接@Provides@Singletonpublic OkHttpClient providesOkHttpClient(){HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {@Overridepublic void log(String message) {try {Log.e("--network--", URLDecoder.decode(message, "utf-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();Log.e("--network--", message);}}});loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);return new OkHttpClient.Builder().sslSocketFactory(new NetworkSSL(TrustManager.trustAllCert), TrustManager.trustAllCert).connectTimeout(TIME_OUT, TimeUnit.SECONDS).addInterceptor(loggingInterceptor).readTimeout(TIME_OUT, TimeUnit.SECONDS).writeTimeout(TIME_OUT, TimeUnit.SECONDS).build();}@Singleton@Providespublic Retrofit providesRetrofit(OkHttpClient okHttpClient){return new Retrofit.Builder().client(okHttpClient).baseUrl(Api.BASE_URL).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).addConverterFactory(GsonConverterFactory.create()).build();}@Singleton@Providespublic Api providesWanAndroidService(Retrofit retrofit){return retrofit.create(Api.class);}}

第三步:创建一个统一异常处理的类ApiException和ErrorConsumer 类

package work;import .ParseException;import com.google.gson.JsonParseException;import org.json.JSONException;import .ConnectException;import .SocketTimeoutException;import .UnknownHostException;/*** @author 浩楠* @date /8/5* <p>* _ _ __ ____ _ _ _* / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___* / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \* / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) |* /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/* 统一的异常处理*/public class ApiException extends Exception{public static final int UNKNOWN = 1000;public static final int PARSE_ERROR = 1001;public static final int NETWORK_ERROR = 1002;private int code;private String displayMessage;public ApiException(int code, String displayMessage) {this.code = code;this.displayMessage = displayMessage;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getDisplayMessage() {return displayMessage;}public void setDisplayMessage(String displayMessage) {this.displayMessage = displayMessage;}public static ApiException handleException(Throwable e) {ApiException ex;if (e instanceof JsonParseException|| e instanceof JSONException|| e instanceof ParseException) {//解析错误ex = new ApiException(PARSE_ERROR, e.getMessage());return ex;} else if (e instanceof ConnectException) {//网络错误ex = new ApiException(NETWORK_ERROR, e.getMessage());return ex;} else if (e instanceof UnknownHostException || e instanceof SocketTimeoutException) {//连接错误ex = new ApiException(NETWORK_ERROR, e.getMessage());return ex;} else {//未知错误ex = new ApiException(UNKNOWN, e.getMessage());return ex;}}}

package work;import org.jetbrains.annotations.NotNull;import io.reactivex.functions.Consumer;/*** @author 浩楠* @date /8/5* <p>* _ _ __ ____ _ _ _* / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___* / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \* / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) |* /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/*统一的异常处理实现Consumer<Throwable>接口*/public abstract class ErrorConsumer implements Consumer<Throwable> {@Overridepublic void accept(@NotNull Throwable throwable) throws Exception {//对异常进行处理ApiException exception;if (throwable instanceof ApiException) {exception = (ApiException) throwable;} else {exception = ApiException.handleException(throwable);}//调用error方法error(exception);}//使用时实现error方法即可。protected abstract void error(ApiException e);}

第四步:对响应进行转换处理

package work;import workdemo.data.ResponseData;import org.jetbrains.annotations.NotNull;import io.reactivex.Observable;import io.reactivex.ObservableSource;import io.reactivex.ObservableTransformer;import io.reactivex.android.schedulers.AndroidSchedulers;import io.reactivex.functions.Function;import io.reactivex.schedulers.Schedulers;/*** @author 浩楠* @date /8/5* <p>* _ _ __ ____ _ _ _* / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___* / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \* / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) |* /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/*/public class ResponseTransformer<T> implements ObservableTransformer<ResponseData<T>, T> {public ResponseTransformer() {}public static <R> ResponseTransformer<R> obtain() {return new ResponseTransformer<>();}@NotNull@Overridepublic ObservableSource<T> apply(@NotNull Observable<ResponseData<T>> upstream) {return upstream.onErrorResumeNext(new Function<Throwable, ObservableSource<? extends ResponseData<T>>>() {@Overridepublic ObservableSource<? extends ResponseData<T>> apply(@NotNull Throwable throwable) throws Exception {return Observable.error(ApiException.handleException(throwable));}}).flatMap(new Function<ResponseData<T>, ObservableSource<T>>() {@Overridepublic ObservableSource<T> apply(@NotNull ResponseData<T> responseData) throws Exception {//请求成功if (0 == responseData.getErrorCode()) {return Observable.just(responseData.getData());}//请求异常return Observable.error(new ApiException(responseData.getErrorCode(), responseData.getErrorMsg()));}}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());}}

第五步:对Hilt进行添加,我们需要对我们的Application添加一个@HiltAndroidApp 的注解,所以我们要在主包下面创建一个app类才继承我们的Application添加注解并且在我们的清单文件中的name中添加我们新建的app类

package workdemo;import android.app.Application;import dagger.hilt.android.HiltAndroidApp;/*** @author 浩楠* @date /8/5* <p>* _ _ __ ____ _ _ _* / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___* / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \* / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) |* /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/*/@HiltAndroidApppublic class App extends Application { }

<applicationandroid:name=".App"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.AndroidDemo"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

最后我们来使用一下我们的这个网络请求

因为我们的接口是banner的接口,我们就不写轮播图了就写一个textview展示一下我们的网络请求的数据就好,

package workdemo;import androidx.appcompat.app.AppCompatActivity;import android.content.Context;import android.os.Bundle;import android.widget.ImageView;import android.widget.TextView;import com.bumptech.glide.Glide;import workdemo.data.ResponseData;import workdemo.databinding.ActivityMainBinding;import work.Api.Api;import work.ApiException;import work.ErrorConsumer;import Workcarrier;import work.ResponseTransformer;import work.bean.BannerBean;import workdemo.utils.Log;import com.youth.banner.Banner;import com.youth.banner.adapter.BannerImageAdapter;import java.util.ArrayList;import java.util.List;import javax.inject.Inject;import dagger.hilt.android.AndroidEntryPoint;import io.reactivex.Observable;import io.reactivex.functions.Consumer;import retrofit2.Call;import retrofit2.Callback;import retrofit2.Response;@AndroidEntryPointpublic class MainActivity extends AppCompatActivity {ActivityMainBinding binding;private TextView text;@InjectApi api;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());text = findViewById(R.id.text_view);initData();}private void initData() {api.BannerRetrofit().compose(ResponseTransformer.obtain()).subscribe(new Consumer<List<BannerBean>>() {@Overridepublic void accept(List<BannerBean> homeBanners) throws Exception {//请求成功if (homeBanners != null) {text.setText(homeBanners.toString());}}}, new ErrorConsumer() {@Overrideprotected void error(ApiException e) {//请求失败Log.e(e.getDisplayMessage() + e.getCode());}});}}

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.appcompat.widget.AppCompatTextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/text_view"android:layout_margin="20dp"/></LinearLayout>

最终效果

源码地址

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。