import com.yumakeji.rxjava.network.error.HttpThrowable;
import com.yumakeji.rxjava.network.handler.RetryWithDelay;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import cc.network.rxjava.rxjava.ServiceApi;
import cc.network.rxjava.textbean.LoginBean;
import cc.network.rxjava.textbean.Top250Bean;
import cc.network.rxjava.viewmodel.RxjavaViewModel;
import cn.yumakeji.jetpackroomstudy.R;
import cn.yumakeji.lib_common.global.AppGlobals;
import cn.yumakeji.lib_common.utils.AppUtils;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import io.reactivex.rxjava3.core.ObservableOnSubscribe;
import io.reactivex.rxjava3.core.ObservableSource;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.functions.Action;
import io.reactivex.rxjava3.functions.BiFunction;
import io.reactivex.rxjava3.functions.Consumer;
import io.reactivex.rxjava3.functions.Function;
import io.reactivex.rxjava3.schedulers.Schedulers;
/**
-
防止多次点击
-
https://www.jianshu.com/p/ea45670a364f,
-
-
Retrofit
-
https://blog.csdn.net/huangxiaoguo1/article/details/65627293
-
-
Rxjava
-
https://www.jianshu.com/p/092452f287db
-
不继承RxAppCompatActivity的情况下使用RxLifeCycle
-
https://blog.csdn.net/kevinscsdn/article/details/78980010
*/
public class RxjavaActivity extends BaseActivity {
private ListView mListView;
private List strings = new CopyOnWriteArrayList<>();
private final String TAG = “Rxjava”;
private RxjavaViewModel viewModel;
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
getLifecycle().removeObserver(viewModel);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rxjava);
mListView = findViewById(R.id.list_item);
strings.add("Get方法 @Query ");
strings.add("Post方法 @Body ");
strings.add(“使用Rxjava切换线程”);
strings.add(“Rxjava(一)emitter”);
strings.add(“Rxjava(二)变换操作符Map”);
strings.add(“Rxjava(三)FlatMap”);
strings.add(“Rxjava(四)concatMap”);
strings.add(“Rxjava(五)接口顺序调用”);
strings.add(“Rxjava(六)接口顺序调用(内部发生错误)”);
strings.add(“Rxjava(七)Zip来打包”);
}
/**
-
去体验Retrofit
-
@param view
*/
public void onRetrofitClick(View view) {
startActivity(new Intent(this, RetrofitActivity.class));
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
viewModel = new RxjavaViewModel(this);
getLifecycle().addObserver(viewModel);
mListView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, strings));
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0://Get方法 @Query
RetrofitClient.getInstance()
.create(ServiceApi.class)// 创建服务
.getSearchContent(“”, 5)//调用接口
.subscribeOn(Schedulers.io())// 指定被观察者的操作在io线程中完成
.doOnSubscribe(disposable -> viewModel.showProgressDialog(“正在请求中”))
.observeOn(AndroidSchedulers.mainThread())//指定观察者接收到数据,然后在Main线程中完成
.retryWhen(new RetryWithDelay(1, 1))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
.doAfterTerminate(() -> viewModel.hintProgressDialog())
.compose(rxLifecycle.bindUntilEvent(Lifecycle.Event.ON_DESTROY))//生命周期
.subscribe(new ConsumerCallback() {
@Override
public void onSucceed(Top250Bean result) {
// 成功获取数据
Toast.makeText(AppGlobals.getApplication().getApplicationContext(),
“成功了” + result, Toast.LENGTH_LONG).show();
}
@Override
public void onError(int code, String msg) {
// 获取数据失败
Toast.makeText(AppGlobals.getApplication().getApplicationContext(),
msg, Toast.LENGTH_LONG).show();
}
}, new ThrowableCallback() {
@Override
public void onError(HttpThrowable httpThrowable) {
// 获取数据失败
Log.i(TAG, httpThrowable.message);
}
});
break;
case 1://POST方法 @Body
ArrayMap<String, Object> map = new ArrayMap<>();
map.put(“jsCode”, “033sHaaK03pRwa2Bic9K0EmcaK0sHaaq”);
RetrofitClient.getInstance()
.create(ServiceApi.class)
.postCode2Session(map)
.subscribeOn(Schedulers.io())
.doOnSubscribe(disposable -> viewModel.showProgressDialog(“正在请求中”))
.observeOn(AndroidSchedulers.mainThread())
.compose(rxLifecycle.bindUntilEvent(Lifecycle.Event.ON_DESTROY))
.retryWhen(new RetryWithDelay(1, 1))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
.doAfterTerminate(() -> viewModel.hintProgressDialog())
.subscribe(new ObserverCallback() {
@Override
public void onSucceed(LoginBean result) {
// 成功获取数据
Toast.makeText(AppGlobals.getApplication().getApplicationContext(),
“成功了” + result, Toast.LENGTH_LONG).show();
}
@Override
public void onFail(int code, String msg) {
// 获取数据失败
Toast.makeText(AppGlobals.getApplication().getApplicationContext(),
msg, Toast.LENGTH_LONG).show();
}
@Override
public void onComplete() {
super.onComplete();
}
});
break;
case 2://使用Rxjava切换线程
Observable.empty().observeOn(Schedulers.io())
.doOnComplete(new Action() {
@Override
public void run() throws Throwable {
Log.i(TAG, “我是子线程:” + AppUtils.isMainThread());
Observable.timer(3, TimeUnit.SECONDS)