在Android开发中,网络请求是非常常用的。而Retrofit这个开源库是当下最火的网络请求库。下面是Retrofit的简介:
还有就是在Android中,有一个主线程,只有在此线程中才可以更新UI,而网络请求是耗时,为了提高用户体验,就规定耗时的操作基本都得放在子线程中。以往我们网络请求完之后是通过Handler、AsyncTask和runOnUiThread。在面试中前两个也是面试的重中之重来的,经常会被问到的。
而现在最火的一个异步库就是Rxjava了,它利用观察者模式很好的解决了子线程与主线程之间的通信。即使业务逻辑复杂起来,它依旧可以做到简洁明了。
如果想要详细了解Rxjava,这里有一篇介绍的蛮详细的:给 Android 开发者的 RxJava 详解
接下来正式使用Retrofit和Rxjava写一个简单的登陆Demo。我在本地简单的写了一个登录响应,返回的json数据是:
准备好之后就新建一个Android项目,先添加一下所需的依赖:
//retrofit2
implementation 'com.google.code.gson:gson:2.8.1'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.okhttp3:okhttp:3.8.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1'
//rxjava2
implementation 'io.reactivex.rxjava2:rxjava:2.1.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
//配合Rxjava2 使用
implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
完了点击刷新,添加一个json数据的实体类:
public class UserInfoModel {
public int code;
public UserInfo data;
public String message;
public static class UserInfo{
public int id;
public String username;
public String email;
public String tel;
}
@Override
public String toString() {
return "UserInfoModel{" +
"code=" + code +
"\n, data{ id=" + data.id +
"\n, username=" + data.username +
"\n, email=" + data.email +
"\n, tel=" + data.tel +
"},\n message='" + message + '}';
}
}
再添加一个service,里面是请求时用到的方法:
public interface UserMsgService {
/**
* 请求登陆的方法,需要两个参数,用的是POST方式
*
* @param username 用户名
* @param password 密码
* @return
*/
@POST("BackStageSystem/servlet/LoginServlet")
Observable<UserInfoModel> login(@Query("username") String username, @Query("password") String password);
}
最后就在Activity里面进行简单的请求:
public class MainActivity extends AppCompatActivity {
private static final String BASE_URL = "http://192.168.6.109:8080/";
private TextView tv_content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_content = findViewById(R.id.tv_content);
}
public void onAction(View view) {
//创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
//获取UserMsgService对象
UserMsgService userMsgService = retrofit.create(UserMsgService.class);
userMsgService.login("zhangsan", "123456")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<UserInfoModel>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(UserInfoModel userInfoModel) {
tv_content.setText(userInfoModel.toString());
}
@Override
public void onError(Throwable e) {
//请求失败的情况
}
@Override
public void onComplete() {
}
});
}
}
布局文件就是一个按钮和显示文本,非常的简单明了。
运行一下查看一下结果:
以上只是简单的使用,Retrofit和Rxjava还有很多很高深的用法,之后再深入研究。