准备
本文需要的框架
Retrofit https://square.github.io/retrofit/
OkHttp https://square.github.io/okhttp/
RxJavahttps://github.com/ReactiveX/RxJava
进入后引用最新版本
Retrofit
1 | dependencies{ |
com.squareup.retrofit2:retrofit:2.3.0
是retrofit的主体
com.squareup.retrofit2:converter-gson:2.3.0
是它的json解析器,使用gson解析结果,因此网络请求的参数类型都必须是json,若想解析String类型,则可替换成com.squareup.retrofit2:converter-scalars:2.3.0
com.squareup.retrofit2:adapter-rxjava2:2.3.0
引入了RxJava2
io.reactivex.rxjava2:rxandroid:2.0.1
则可指定事件发生的线程
com.squareup.okhttp3:logging-interceptor:3.9.0
是okHttp的拦截器,打印日志用的
com.trello.rxlifecycle2:rxlifecycle-components:2.2.0
是用于绑定生命周期,解决RxJava内存泄漏
Manifast.xml加入权限
1 | <uses-permission android:name="android.permission.INTERNET"/> |
开始
先写一个HttpConfig ,用于基础的参数配置
1 | /** |
新建基础解析类,比如我要解析一个1
2
3
4
5
6
7
8
9{
"code":"200",
"msg":"请求成功",
"result":{
"username":"张三",
"age":20,
"adress":"北京"
}
}
新建HttpResult.class1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47/**
* Created by Liompei
* time : 2017/12/27 10:10
* 1137694912@qq.com
* https://github.com/liompei
* remark:基础解析类
*/
public class HttpResult<T> {
"code") (
private int code;
"message") (
private String message;
"result") (
private T result;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
public String toString() {
return "code: " + code + "\nmessage: " + message + "\nresult: " + result;
}
}
解析的结果1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38/**
* Created by Liompei
* time : 2017/12/27 10:31
* 1137694912@qq.com
* https://github.com/liompei
* remark:
*/
public class UserBean {
private String username;
private int age;
private String address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
新建HttpCallback1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26/**
* Created by Liompei
* time : 2017/12/27 10:08
* 1137694912@qq.com
* https://github.com/liompei
* remark:
*/
public abstract class HttpCallback<T> {
public void onSubscribe(Disposable d) {
}
public abstract void onNext(HttpResult<T> httpResult);
public void onError(Throwable e) {
Zx.d(e.getMessage());
Zx.show(e.getMessage());
}
public void onFinish() {
}
}
MyObserver
1 | /** |
新建接口类,放置要请求的参数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20/**
* Created by Liompei
* time : 2017/12/27 10:29
* 1137694912@qq.com
* https://github.com/liompei
* remark:模拟接口
*/
public interface HttpService {
"login") (
Observable<HttpResult<UserBean>> getLogin("username") String username, ("password") String password); (
"login") (
Observable<HttpResult<UserBean>> postLogin("username") String username, ("password") String password); (
}
如果返回结果是list,则将`Observable<HttpResult<UserBean>>`改为`Observable<HttpResult<List<UserBean>>>`即可
新建HttpRequest,放置要请求的参数配置
第一是单例的实例化,第二是请求的接口内容
1 | /** |
最后加入请求1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18//****************请求*********************
public void getLogin(RxAppCompatActivity activity, String username, String password, HttpCallback<UserBean> httpCallback) {
Observable<HttpResult<UserBean>> observable = mHttpService.getLogin(username, password);
observable.subscribeOn(Schedulers.io());
observable.unsubscribeOn(Schedulers.io());
observable.compose(RxLifecycle.bindUntilEvent(activity.lifecycle(), ActivityEvent.DESTROY));
observable.observeOn(AndroidSchedulers.mainThread());
observable.filter(new Predicate<HttpResult<UserBean>>() {
public boolean test(HttpResult<UserBean> httpResult) throws Exception {
if (!httpResult.isSuccess()) {
throw new Exception(httpResult.getMessage() + ",错误码: " + httpResult.getCode());
}
return true;
}
});
observable.subscribe(new MyObserver<UserBean>(httpCallback));
}
代码太多了,每次都要写这么多,可以新建一个方法调用,比如
1 | private void toSubscribe(RxAppCompatActivity activity, Observable observable, MyObserver observer) { |
1 | public void postLogin(RxAppCompatActivity activity,String username,String password,HttpCallback<UserBean> httpCallback){ |
调用的方法比较简单,
1 | HttpRequest.getInstance().getLogin(this, "", "", new HttpCallback<UserBean>() { |
上传文件
在HttpService中加入以下
1 |
|
这里是假设通过id和头像文件修改头像
在HttpRequest中加入以下代码
1 | public void upload(RxAppCompatActivity activity, String id, File file,HttpCallback<UserBean> httpCallback){ |
其他注意事项
1 | @GET("") //get请求 |