# 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





##### 基于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