Rxjava实战笔记---线程控制解析(同步结合示例)

58 阅读1分钟
  • 再次强调, Rxjava是一个异步框架, 在控制线程上非常方便, 相较之下,Handler、AsyncTask的逻辑编写显得繁琐;

##下面通过一个示例来体会Rxjava的线程控制 首先,添加retrofit依赖:

    implementation 'com.squareup.retrofit2:retrofit:2.1.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.1.0'

准备一个API接口:

package com.cniao5.cniao5rxjava2demo;

import io.reactivex.Observable;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;

public interface Api {

    @GET("user/{id}")
    Call<User> getUserInfoWithPath(@Path("id") int user_id);
}

准备一个User数据类:

package com.cniao5.cniao5rxjava2demo;

import com.google.gson.Gson;

/**
 * Created by Ivan on 2016/10/7.
 */


public class User {

    //定义字段
    private String head_url;
    private String id;
    private String username;

    //三个构造方法
    public User(String head_url, String id, String username) {
        this.head_url = head_url;
        this.id = id;
        this.username = username;
    }

    public User(String id, String username) {
        this.id = id;
        this.username = username;
    }

    public User() {
    }

    //三对getter and setter
    public String getHead_url() {
        return head_url;
    }

    public void setHead_url(String head_url) {
        this.head_url = head_url;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    //toString
    @Override
    public String toString() {
        return new Gson().toJson(this);
    }
}

准备一个Activity,其布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_scheduler"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.cniao5.cniao5rxjava2demo.SchedulerTestActivity">


    <Button
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:onClick="click"
            android:text="Test"/>


    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>


</LinearLayout>

其java:

package com.cniao5.cniao5rxjava2demo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;


import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class SchedulerTestActivity extends AppCompatActivity {


    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scheduler_test);

        mTextView = (TextView) findViewById(R.id.text);
    }

    public void click(View view) {
        Observable.create(new ObservableOnSubscribe<User>() {
            @Override

            // 主线程里面执行
            public void subscribe(ObservableEmitter<User> e) throws Exception {

                User user = new User("1","青莲居士");
                e.onNext(user);

            }
        }).subscribe(new Observer<User>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(User user) {
                Log.d("SchedulerTestActivity",""+user);
                mTextView.setText(user.getUsername());
            }

            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }

            @Override
            public void onComplete() {

            }
        });
    }
}

运行示例,点击按钮,打印日志:

2019-06-07 17:24:36.048 15571-15571/com.cniao5.cniao5rxjava2demo D/SchedulerTestActivity: {"id":"1","username":"青莲居士"}

效果图:

打印任何Object的时候其实打印的都是它的toString()方法, 而我们在User类中已经重写了toString()了, 调用Gson()的方法把对象转换成json字符串:

    //toString
    @Override
    public String toString() {
        return new Gson().toJson(this);
    }

(如果不重写toString()的话,则默认打印对象的内存地址)