- 再次强调, 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()的话,则默认打印对象的内存地址)