RxAndroid 进行封装实现替代Handler的方案

概述.在android中如果我们开启了一个新的线程,但是执行完毕之后需要更新UI我们一般使用Handler来操作,这样就出现了2个问题:

1.只要需要在ui线程中执行ui更新 我们就需要在Activity中创建一个Handler对象,同时我们还需要创建Message来发送,同时还需要在Handler中进行判断,这样代码的可阅读性就降低很多了,而且代码编写起来也很烦。

2.需要异步执行任务时如果我们简单的就直接创建一个新的线程的话,很浪费资源,如果使用一个统一管理的线程池的话,也很容易出现问题。

于是,我便开始寻找能够解决这2个问题的方法,最后我找到了RxAndroid,有兴趣的可以去看看别人写的RxJava或者RxAndroid的介绍。使用了一次后,我感觉RxAndroid实在是太好用了,我仅仅是使用了其中的一小点功能就给我的代码编写带来了很多的 ,因此有时间我还会继续学习RxAndroid更多的内容,把其中方便的东西拿出来使用到实际开发中。


别的东西不多说了,上关键代码:

1.首先是任务的封装:

   我封装了3种任务: IO任务-在耗时线程中执行的任务 ,UI任务-在UI线程中执行的任务,通用任务-先执行耗时任务,耗时任务执行完成后再执行UI任务。

  IO任务:

package bluetooth.Util.rxjava.bean;

/**
 * 在IO线程中执行的任务
 * Created by z2wenfa on 2016/3/31.
 */
public abstract class IOTask<T> {
    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }


    public IOTask(T t) {
        setT(t);
    }


    public abstract void doInIOThread();
}
UI任务:

package bluetooth.Util.rxjava.bean;

/**
 * 在主线程中执行的任务
 */
public abstract class UITask<T> {
    
    public abstract void doInUIThread();

    public UITask(T t) {
        setT(t);
    }

    public UITask() {

    }

    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
}
通用任务:

package bluetooth.Util.rxjava.bean;

import com.baidu.platform.comapi.map.C;

import rx.Observable;

/**
 * 通用的Rx执行任务
 * Created by z2wenfa on 2016/3/30.
 */
public abstract class CommonRxTask<T> {
    public CommonRxTask(T t) {
        setT(t);
    }

    public CommonRxTask() {

    }

    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }

    public abstract void doInIOThread();

    public abstract void doInUIThread();


    public abstract class MyOnSubscribe implements Observable.OnSubscribe<C> {
        private C t;

        public MyOnSubscribe(C c) {
            setT(t);
        }

        public C getT() {
            return t;
        }

        public void setT(C c) {
            this.t = c;
        }

    }

}
 简单介绍下泛型的作用吧,大家可以看到有一个泛型为T的变量,通用任务中我为了区分执行时的泛型所以改成了C其实都是一样的效果,就是存储在任务执行中需要执行的结果的变量。

2.一个自定义的OnSubsribe对象:

public abstract class MyOnSubscribe<C> implements Observable.OnSubscribe<C> {
    private C c;

    public MyOnSubscribe(C c) {
        setT(c);
    }

    public C getT() {
        return c;
    }

    public void setT(C c) {
        this.c = c;
    }


}

这个泛型的变量其实是用来存放CommonTask的。


3.最关键的执行代码如下:

<pre name="code" class="java">/**
 * Rxjava封装工具类
 * Created by z2wenfa on 2016/3/30.
 */
public class RxjavaUtil {

    /**
     * 在ui线程中工作
     *
     * @param uiTask
     */
    public static <T> void doInUIThread(UITask<T> uiTask) {
		Observable.just(uiTask)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<UITask<T>>() {
                    @Override
                    public void call(UITask<T> uitask) {
                        uitask.doInUIThread();
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        throwable.printStackTrace();
                    }
                });
}

 /*** 在IO线程中执行任务 * * @param <T> */
 public static <T> void doInIOThread(IOTask<T> ioTask) { 
       Observable.just(ioTask)
                .observeOn(Schedulers.io())
                .subscribe(new Action1<IOTask<T>>() {
                    @Override
                    public void call(IOTask<T> ioTask) {
                        ioTask.doInIOThread();
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        throwable.printStackTrace();
                    }
                });
}
 
/** * 执行Rx通用任务 (IO线程中执行耗时操作 执行完成调用UI线程中的方法) * * @param t * @param <T> */ 
public static <T> void executeRxTask(CommonRxTask<T> t) {
        MyOnSubscribe<CommonRxTask<T>> onsubscribe = new MyOnSubscribe<CommonRxTask<T>>(t) {
            @Override
            public void call(Subscriber<? super CommonRxTask<T>> subscriber) {
                getT().doInIOThread();
                subscriber.onNext(getT());
                subscriber.onCompleted();
            }
        };
        Observable.create(onsubscribe)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<CommonRxTask<T>>() {
                    @Override
                    public void call(CommonRxTask<T> t) {
                        t.doInUIThread();
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        throwable.printStackTrace();
                    }
                });
}

 

 
 

最后写几个简单的使用方法吧:

 
 private void test(){
        String str="test1";
        RxjavaUtil.doInIOThread(new IOTask<String>(str) {
            @Override
            public void doInIOThread() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Log.v("test",getT());
            }
        });




        new Thread(new Runnable() {
            @Override
            public void run() {
                String str2="test2";
                RxjavaUtil.doInUIThread(new UITask<String>(str2) {
                    @Override
                    public void doInUIThread() {
                        TextView tv=findViewByid(R.id.tv);
                        tv.setText(getT());
                    }
                });
            }
        }).start();

        
        String str3="test3";
        RxjavaUtil.executeRxTask(new CommonRxTask<String>(str3) {
            @Override
            public void doInIOThread() {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                setT(getT()+"小尾巴");

            }

            @Override
            public void doInUIThread() {
                TextView tv=findViewByid(R.id.tv);
                tv.setText(getT());
            }
        });

    }


使用起来感觉还是比较方便的,随时随地想使用IO线程就IO线程,想在新线程中使用UI操作就进行UI操作,先执行耗时操作,再操作UI组件也是随时随地。

 希望能够给大家带来方便。


Demo代码地址


附上 RxAndroid库:

compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'

 





  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值