RxJava实例-线程切换

本文展示了如何在Android应用中使用RxJava进行线程切换。通过一个包含两个按钮、一个进度条和一个RecyclerView的UI示例,演示了如何在后台线程执行耗时操作,并切换回主线程更新UI。文章提供了通用Adapter的编写方法以及关键代码片段,包括doSomethingBlocked()方法的实现,该方法模拟了耗时操作。完整源代码可在GitHub上找到。
摘要由CSDN通过智能技术生成

简书原文链接:RxJava实例-线程切换

效果图

RxJava后台耗时任务.gif

简单说明

UI包括两个按钮,一个进度条,一个RecyclerView,其中RecyclerView用来显示log信息,后面的例子都是这个形式。

写一个通用的Adapter

既然打算写一些RxJava的Demo,那么最简单直观的方式就是将log显示处理,让处理过程直接明了。

public class LogAdapter extends RecyclerView.Adapter<LogAdapter.ViewHolder>{

    private Context mContext;

    private List<String> mLogs;

    public LogAdapter(Context context, @NonNull List<String> logs){
        this.mContext = context;
        this.mLogs = logs;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_log,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if (mLogs.size() > 0){
            holder.tvLog.setText(mLogs.get(position));
        }
    }

    @Override
    public int getItemCount() {
        return mLogs.size();
    }


    class ViewHolder extends RecyclerView.ViewHolder{

        TextView tvLog;

        public ViewHolder(View itemView) {
            super(itemView);
            tvLog = (TextView) itemView.findViewById(R.id.tv_item_log);
        }

    }

}

其中UI就只有一个TextView,用来显示log信息

封装一下log的输出方法:

private void log(String logMsg){
        if (isMainThread()){
            mLogs.add(logMsg + "(主线程)");
            mAdapter.notifyDataSetChanged();
        }else {
            mLogs.add(logMsg + "(非主线程)");
            //此处必须在UI线程更新(因为此时RecycelrView可能还在计算布局或者滚动)
            new Handler(Looper.getMainLooper())
                    .post(new Runnable() {
                        @Override
                        public void run() {
                            mAdapter.notifyDataSetChanged();
                        }
                    });
        }
        Log.d(TAG, "log: itemCount ->" + mAdapter.getItemCount());

    }


  private boolean isMainThread(){
        return Looper.getMainLooper() == Looper.myLooper();
    }

主要代码

点击开始按钮,开始执行下面的代码:

subscription = Observable.just(true)
                .map(new Func1<Boolean, Boolean>() {
                    @Override
                    public Boolean call(Boolean aBoolean) {
                        log("Observable -> map -> call");
                        doSomethingBlocked();
                        return aBoolean;
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Boolean>() {
                    @Override
                    public void onCompleted() {
                        mProgressBgWork.setVisibility(View.INVISIBLE);
                        log("subscriber -> onCompleted");
                    }

                    @Override
                    public void onError(Throwable e) {
                        mProgressBgWork.setVisibility(View.INVISIBLE);
                        log("subscriber -> onError :" + e.getMessage());
                    }

                    @Override
                    public void onNext(Boolean aBoolean) {
                        log("subscriber -> onNext :" + aBoolean);
                    }
                });

其中用doSomethingBlocked()模拟耗时操作,耗时操作在io线程执行,然后切换到主线程展示log。
下面是doSomethingBlocked()的代码:

private void doSomethingBlocked() {
        log("进行耗时操作");
        try{
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

源代码

总参考:https://github.com/kaushikgopal/RxJava-Android-Samples.git
Demo地址:https://github.com/jiangkang/KLearnAndroid.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值