美文网首页android
Android RxJava+Retrofit实现

Android RxJava+Retrofit实现

作者: 1a473fcb13b0 | 来源:发表于2019-01-14 20:33 被阅读0次

github地址:https://github.com/hnhzy/RxRetrofitProject
接着Android retrofit基本使用及原理探究RxJava+Retrofit的实现

简单实现

1、导入依赖库

//retrofit2
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'

// 用Gson解析json的转换器
implementation 'com.google.code.gson:gson:2.8.5'

//rxjava2
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.5'

2、创建ApiService

/**
 * Created by hzy on 2019/1/10
 **/
public interface ApiService {

    /**
     * 获取知识体系数据
     * @param page
     * @param cid
     * @return
     */
    @GET("article/list/{page}/json")
    Observable<KnowledgeSystem> getKnowledgeSystem(@Path("page") int page, @Query("cid") int cid);

}
public class Urls {
    public static final String BASIC_URL = "http://www.wanandroid.com/"; //鸿洋玩安卓网站
}

3、创建RxSchedulers

/**
 * Created by hzy on 2019/1/10
 * 线程调度
 **/
public class RxSchedulers {

    final static ObservableTransformer Stf = new ObservableTransformer() {
        @Override
        public ObservableSource apply(@NonNull Observable upstream) {
            return upstream.subscribeOn(Schedulers.newThread())
                    .observeOn(AndroidSchedulers.mainThread());

        }
    };

    static <T> ObservableTransformer<T, T> applySchedulers() {
        return Stf;
    }

    @SuppressWarnings("unchecked")
    public static <T> ObservableTransformer<T, T> io_main() {
        return (ObservableTransformer<T, T>) applySchedulers();
    }

}

4、创建Retrofit获取数据,并以TextView显示

public class MainActivity extends AppCompatActivity {

    public static final String TAG = "MainActivity";
    /**
     * Hello World!
     */
    private TextView mTvHello;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTvHello = (TextView) findViewById(R.id.tv_hello);
        //1、创建retrofit
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Urls.BASIC_URL)
                //添加转换器Converter(将 json 转为 JavaBean):
                .addConverterFactory(GsonConverterFactory.create())
                //创建 Retrofit 的时候添加如下代码:
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        //2、用retrofit加工出对应的接口实例对象
        ApiService api = retrofit.create(ApiService.class);
        //3、获取数据并更新UI--再也不需要使用handler或者runOnUiThread了
        api.getKnowledgeSystem(1, 60)
                .compose(RxSchedulers.<KnowledgeSystem>io_main())
                .subscribe(new Consumer<KnowledgeSystem>() {
                    @Override
                    public void accept(KnowledgeSystem knowledgeSystem) throws Exception {
                        Log.e(TAG, "KnowledgeSystem--" + knowledgeSystem.toString());
                        mTvHello.setText(knowledgeSystem.toString());
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Log.e(TAG, "Throwable--" + throwable.toString());
                    }
                });
    }
}

简单封装

1、okhttp、retrofit封装

/**
 * Created by hzy on 2019/1/10
 * 网络请求
 **/
public class HttpManager {

    private static final String BASE_URL = "http://www.wanandroid.com/";

    private Retrofit mRetrofit;
    private HashMap<Class, Retrofit> mServiceHashMap = new HashMap<>();


    public HttpManager() {
        // init okhttp 3 logger
        HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor();
        logInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE);
        // int okhttp
        OkHttpClient client = new OkHttpClient.Builder()
                .retryOnConnectionFailure(true)
                .connectTimeout(15, TimeUnit.SECONDS)
                .readTimeout(45, TimeUnit.SECONDS)
                .writeTimeout(55, TimeUnit.SECONDS)
                .addInterceptor(logInterceptor)
                .build();
        // int retrofit
        mRetrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(StringConverterFactory.create())
                .build();

        mServiceHashMap.put(ApiService.class, mRetrofit);
    }


    public <T> T getService(Class<T> clz) {
        Retrofit retrofit = mServiceHashMap.get(clz);
        if (retrofit != null) {
            T service = retrofit.create(clz);
            return service;
        } else {
            return null;
        }
    }
}

2、ApiService

/**
 * Created by hzy on 2019/1/10
 * ApiService
 **/
public interface ApiService {

    /**
     * 获取知识体系数据
     * @param page
     * @param cid
     * @return
     */
    @GET("article/list/{page}/json")
    Observable<KnowledgeSystem> getKnowledgeSystem(@Path("page") int page, @Query("cid") int cid);

}

3、通过App获取apiService

/**
 * Created by hzy on 2019/1/14
 **/
public class App extends Application {

    private static App mInstance;
    private HttpManager mHttpManager = null;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance=this;
        mHttpManager = new HttpManager();
    }

    public static <T> T apiService(Class<T> clz) {
        return getInstance().mHttpManager.getService(clz);
    }


    public static App getInstance(){
        return mInstance;
    }


}

4、调用接口获取数据

public class MainActivity extends AppCompatActivity {

    public static final String TAG = "MainActivity";
    /**
     * Hello World!
     */
    private TextView mTvHello;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTvHello = (TextView) findViewById(R.id.tv_hello);

        App.apiService(ApiService.class)
                .getKnowledgeSystem(1, 60)
                .compose(RxSchedulers.<KnowledgeSystem>io_main())
                .subscribe(new Consumer<KnowledgeSystem>() {
                    @Override
                    public void accept(KnowledgeSystem knowledgeSystem) throws Exception {
                        Log.e(TAG, "KnowledgeSystem--" + knowledgeSystem.toString());
                        mTvHello.setText(knowledgeSystem.toString());
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Log.e(TAG, "Throwable--" + throwable.toString());
                    }
                });

    }
}

参考文章
https://www.jianshu.com/p/0ad99e598dba

相关文章

网友评论

    本文标题:Android RxJava+Retrofit实现

    本文链接:https://www.haomeiwen.com/subject/lyefdqtx.html