package me.jessyan.mvpart.demo;

import me.jessyan.art.mvp.BasePresenter;
import me.jessyan.art.mvp.Message;
import rx.Observable;
import rx.functions.Action1;
import rx.functions.Func1;

/**
 * Created by jess on 24/02/2017 17:55
 * Contact with jess.yan.effort@gmail.com
 */

public class MainPresenter extends BasePresenter {

    /**
     * 如果需要依赖一些外部的数据,可以在调用时通过将数据封装到Message中,也可以直接通过方法参数传入
     * 通过将数据封装到Message中的方式好处是,即使需要的数据类型发生改变,也不用更改方法,所以也不会影响到上层调用
     * @param message
     */
    public void request(Message message) {
        addSubscrebe(Observable.just(message)
                .filter(new Func1<Message, Boolean>() {
                    @Override
                    public Boolean call(Message message) {
                        return message != null;
                    }
                })
                .subscribe(new Action1<Message>() {
                    @Override
                    public void call(Message message) {
                        //如果需要对view操作多次(把一个复杂的操作细分成多个,便于维护)
                        //那前几次都调用HandleMessageToTargetUnrecycle()
                        //只有最后一次,才调用HandleMessageToTarget()
                        //因为HandleMessageToTarget()处理完操作后,会把message中的所有字段置为空,包括view的引用
                        //并且不管你要对view操作几次,必须在最后调用HandleMessageToTarget(),否则可能发生内存泄漏
                        //message.getTarget().showMessage();使用message.getTarget()可以拿到BaserView的引用从而调用一些默认的方法
                        message.what = 0;
                        message.arg1 = R.color.colorPrimaryDark;
                        message.HandleMessageToTargetUnrecycle();
                        message.what = 1;
                        message.str = "hello " + message.obj;
                        message.HandleMessageToTarget();
                    }
                }));
    }


    /**
     * 整个presenter中每个方法使用到的what字段不能重复,如上面的方法what字段使用了0和1
     * 那后面的方法就必须使用其他数字
     * @param message
     */
    public void request2(Message message) {
        addSubscrebe(Observable.just(message)
                .filter(new Func1<Message, Boolean>() {
                    @Override
                    public Boolean call(Message message) {
                        return message != null;
                    }
                }).subscribe(new Action1<Message>() {
                    @Override
                    public void call(Message message) {
                        message.what=2;
                        message.HandleMessageToTarget();
                    }
                }));

    }
}

@@ -1411,16 +1411,121 @@
 %E4%B8%80%E4%BA%9B%E9%BB%98%E8%AE%A4%E7%9A%84%E6%96%B9%E6%B3%95%0A
+                        //%E8%B0%83%E7%94%A8%E9%BB%98%E8%AE%A4%E6%96%B9%E6%B3%95%E5%90%8E%E4%B8%8D%E9%9C%80%E8%A6%81%E8%B0%83%E7%94%A8HandleMessageToTarget(),%E4%BD%86%E6%98%AF%E5%A6%82%E6%9E%9C%E5%90%8E%E9%9D%A2%E5%AF%B9view%E6%B2%A1%E6%9C%89%E5%85%B6%E4%BB%96%E6%93%8D%E4%BD%9C%E4%BA%86%E8%AF%B7%E8%B0%83%E7%94%A8message.recycle()%E5%9B%9E%E6%94%B6%E6%B6%88%E6%81%AF%0A
         

improve demo