Retrofit和Rxjava的简单使用

版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明作者和出处。 https://blog.csdn.net/Jsagacity/article/details/81839078

在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还有很多很高深的用法,之后再深入研究。

猜你喜欢

转载自blog.csdn.net/Jsagacity/article/details/81839078