# android-network-case **Repository Path**: fallenaimmmmmm/android-network-case ## Basic Information - **Project Name**: android-network-case - **Description**: 19级android网络编程案例集 - **Primary Language**: Android - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-03-28 - **Last Updated**: 2022-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # android-network-case #### 介绍 19级android网络编程案例集 #### 技术点 1. android recyclerview 2. Retrofit 3. RxJava2 4. Android RxJava2 5. GSon #### 模块说明 1. app模块演示基本的Retrofit使用 1. 实现:通过网络访问获得天气预报信息 https://www.qqlykm.cn/api/api/tq.php
2. 开发步骤:
2.1 引入相关依赖
`````` implementation 'com.squareup.retrofit2:retrofit:2.0.2' // https://mvnrepository.com/artifact/com.squareup.retrofit2/converter-scalars implementation group: 'com.squareup.retrofit2', name: 'converter-scalars', version: '2.3.0' // 用Gson解析json的转换器 implementation 'com.squareup.retrofit2:converter-gson:2.0.2' `````` 2.2 开启网络请求权限(AndroidManifest.xml)
`````` `````` 2.3 封装json响应类
2.4 封装服务接口(核心)
```java public interface GetTianQiServiceApi { @HTTP(method = "GET",path = "/api/api/tq.php",hasBody = false) public Call getData(@Query("city") String city); } ``` 2.5 调用接口并返回响应信息(Activity中核心代码)
```java private void exec(){ //1.创建Retrofix对象 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://www.qqlykm.cn/") .addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(ScalarsConverterFactory.create()) .build(); //2.获得service GetTianQiServiceApi service = retrofit.create(GetTianQiServiceApi.class); //3.调用接口方法 Call res = service.getData("济南"); //4.返回响应并解析 res.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { Log.i("kkkk",response.body().getDesc()); } @Override public void onFailure(Call call, Throwable t) { Log.e("yyy",t.getMessage()); } }); } ``` 2. app模块中包含了调用阿里云API市场的案例
```java public interface CheckMobileNullApiService { @HTTP(method = "GET",path = "/mobile_empty",hasBody = false) public Call getData(@Query("mobile") String mobile, @Header("Authorization") String appCode); } ``` 说明:此api需要在报文头中加入appCode,所以使用了@ Header("Authorization")
```java Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://slymempt.market.alicloudapi.com") .addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(ScalarsConverterFactory.create()) .build(); CheckMobileNullApiService service = retrofit.create(CheckMobileNullApiService.class); Call res = service.getData(checkMobile,"APPCODE 1c3202fa92cae4923f004844"); ``` 其中**APPCODE 1c3202fa92cae4923f004844** 是授权值 3. 使用post发送请求 - 使用@post注解 - 使用@FormUrlEncoded注解 - 参数注解改为:@Field,而非get方式的@Query 其他与@get一致 eg: ```java @FormUrlEncoded @POST("/isbn/query") public Call getData(@Field("isbn") String isbn,@Header("Authorization") String appCode); ``` ##### 原理 - async,handler - okhttp3,retrofit2 - RxJava2 ![](imgs/rxjava2/1.jpg) ![](imgs/rxjava2/2.png) ![](imgs/rxjava2/3.png) ![](imgs/rxjava2/4.png) ![](imgs/rxjava2/5.png) ##### 基于RxJava2+Retrofit的开发步骤 1. 引入相应包 ```java // https://mvnrepository.com/artifact/io.reactivex.rxjava2/rxjava implementation group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.2.19' // https://mvnrepository.com/artifact/com.squareup.retrofit2/adapter-rxjava2 implementation group: 'com.squareup.retrofit2', name: 'adapter-rxjava2', version: '2.3.0' // https://mvnrepository.com/artifact/io.reactivex.rxjava2/rxandroid implementation group: 'io.reactivex.rxjava2', name: 'rxandroid', version: '2.0.1' ``` 2. 开放网络配置 略 3. 创建json实体类 略 4. 创建api service接口 ```java @FormUrlEncoded @POST("/isbn/query") public Observable getDataForRxJava2(@Field("isbn") String isbn,@Header("Authorization") String appCode); ``` 返回被观察者(Observable) 5. 在activity中异步调用 ```java public void exec4ForRxJava2(String isbn){ Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://jisuisbn.market.alicloudapi.com") .addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(ScalarsConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); ISBNServiceApi api = retrofit.create(ISBNServiceApi.class); api.getDataForRxJava2(isbn,"APPCODE 1c3202fe6fd94e0a92cae4923f004844") .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(ISBNResponse isbnResponse) { Toast.makeText(MainActivity.this,isbnResponse.getMsg(),Toast.LENGTH_SHORT).show(); } @Override public void onError(Throwable e) { Log.e("kkzzjjj",e.getMessage()); } @Override public void onComplete() { Log.i("complete","okikikkkkk"); } }); } ``` 或者 ```java public void exec4ForRxJava2(String isbn){ Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://jisuisbn.market.alicloudapi.com") .addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(ScalarsConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); ISBNServiceApi api = retrofit.create(ISBNServiceApi.class); api.getDataForRxJava2(isbn,"APPCODE 1c3202fe6fd94e0a92cae4923f004844") .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Consumer() { @Override public void accept(ISBNResponse isbnResponse) throws Exception { Toast.makeText(MainActivity.this,isbnResponse.getMsg(),Toast.LENGTH_SHORT).show(); } }); } ``` ##### 作业练习 1. 调用阿里云API市场(https://market.aliyun.com/products/57126001/cmapi013556.html?spm=5176.78296.J_3771263310.1.bd9d5d76bii2QK#sku=yuncode755600000)完成练习. #### 第三方api地址 1. https://www.qqlykm.cn/api/api/tqw.php 2. 测试地址:https://qqlykm.cn/api/api/tq.php?city=广州 3. JSON格式化地址:https://www.json.cn/ #### 版权说明 1. 本案例集只限于山东科技大学教学演示 2. 本案例不接受Pull Request