美文网首页程序猿
使用BaseActivity+RxBus+BroadCastRe

使用BaseActivity+RxBus+BroadCastRe

作者: 耀东wang | 来源:发表于2018-08-01 12:01 被阅读297次

MVP最近时越来越火了,在本Demo中也使用了MVP模式,使得业务层和视图层接口互相抽离,这样一来整个业务变得清晰多了,这里我的Activity就是只有一个业务就是发起HTTP请求,然后他对应的视图接口就是展示从服务器上获得的信息。
首先我们先来看看MVP的基本Base:
BaseView:


public interface BaseView {

    /**
     * 显示loading
     */
    void showProgress();
    /**
     * 隐藏loading框
     */
    void hideProgress();
    /**
     * 消息提示
     */
    void toast(String msg);

}

BasePresenter

public abstract class BasePresenter<T> {
    /**
     * 这里可以初始化View接口
     */
    public T view;
     private LifecycleProvider<ActivityEvent>provider;
    /**
     *
     * @param view Activity或者Fragment中的引用this
     */
    public void attach(T view){
        this.view=view;
    }
    public void detach(){
        this.view=null;
    }

    public BasePresenter(LifecycleProvider<ActivityEvent>provider){
        this.provider=provider;
    }


    public LifecycleProvider<ActivityEvent> getProvider() {
        return provider;
    }

    public void setProvider(LifecycleProvider<ActivityEvent> provider) {
        this.provider = provider;
    }

}

MvpActivity

public abstract class MvpActivity<V,P extends BasePresenter<V>> extends BaseActivity {
    protected P presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        presenter=initPresenter();//实例化Presenter
        presenter.attach((V) this);//实例化接口引用
    }

    @Override
    protected void onResume() {
        super.onResume();
        presenter.attach((V) this);//绑定view接口,相当于拿到接口的引用
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.detach();//耗时操作在这里也结束
    }
    //实例化Presenter
    public abstract P initPresenter();
}

BaseActivity

/**
 * 继承RxAppCompatActivity,内部实现了RxLifeCycle的接口
 */
public class BaseActivity extends RxAppCompatActivity {

    private Observable<MessageEvent> observable;
    private Disposable dp;
    public baseActivityInterface baseActivityInterface;
    //广播
    private NetChangeReceiver netChangeReceiver;
    @Inject
    MyToast myToast;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        RegistReceiver();
        getRxBus();
    }

    private void RegistReceiver() {
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);//网络连接过滤器
        netChangeReceiver=new NetChangeReceiver();
        this.registerReceiver(netChangeReceiver,intentFilter);
    }

    private void getRxBus() {

        observable= RxBus.getInstance().toObservable(MessageEvent.class);
        observable.observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<MessageEvent>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        dp=d;
                    }
                    @Override
                    public void onNext(MessageEvent messageEvent) {
                        if(!messageEvent.isConnect()){
                            //断开网络提示信息
                            myToast.showToast(BaseActivity.this,messageEvent.getNetStateMessage());
                        }
                        else if(!messageEvent.isLastConnect()&&messageEvent.isConnect()){
                            baseActivityInterface.reConnect();//重新发起http请求
                        }
                    }
                    @Override
                    public void onError(Throwable e) {

                    }
                    @Override
                    public void onComplete() {

                    }
                });
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        RxBus.getInstance().unregister(dp);//取消订阅
        this.unregisterReceiver(netChangeReceiver);//取消广播接收器
    }
}

我们看到,再网络断开然后再重新连接的时候我们调用了baseActivityInterface reConnect接口。接下来可以简单看看baseActivityInterface,其实还可以继续添加其他的操作在里面。

public interface baseActivityInterface {

    void reConnect();

}

然后看看我们的网络状态监听广播:

public class NetChangeReceiver extends BroadcastReceiver {
    private String netStateMessage="";
    private boolean isConnect=false;
    private boolean LastConnect=true;
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
        if(networkInfo!=null&&networkInfo.isAvailable()){
            switch (networkInfo.getType()){
                case ConnectivityManager.TYPE_WIFI:
                    netStateMessage="正在使用Wifi上网";
                    isConnect=true;
                    //发送
                    RxBus.getInstance().post(new MessageEvent(netStateMessage,LastConnect,isConnect));//发送消息
                    LastConnect=isConnect;//如果初始化为true
                    break;
                case ConnectivityManager.TYPE_MOBILE:
                    netStateMessage="正在使用2G/3G/4G网络";
                    isConnect=true;
                    //发送
                    RxBus.getInstance().post(new MessageEvent(netStateMessage,LastConnect,isConnect));//发送消息
                    LastConnect=isConnect;//如果初始化为true
                    break;
                    default:
                        break;
            }
        }else {
            netStateMessage="当前无网络连接";
            isConnect=false;
            //发送
            RxBus.getInstance().post(new MessageEvent(netStateMessage,LastConnect,isConnect));//发送消息
            LastConnect=isConnect;//如果初始化为true
        }
    }
}

这里简单记录了一下网络状态变化之前的状态
当LastConnect=false,isConnect=true表示我们需要重新发起请求。
然后看看NetWorkPresenter

public class NetWorkPresenter extends BasePresenter<NetWorkView>{

    public NetWorkPresenter(LifecycleProvider<ActivityEvent> provider) {
        super(provider);
    }
    public void getData(PageParmForm pageParmForm, Context mContext){
        new NetRepository().getApplication(pageParmForm)
                 .compose(getProvider().<UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>>>bindUntilEvent(ActivityEvent.DESTROY)
                .subscribe(new BaseObserver<UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>>>(mContext) {
                    @Override
                    public void onError(ExceptionHandle.ResponseException exception) {
                        view.toast(exception.getMessage());
                    }

                    @Override
                    public void onNext(UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>> Response) {
                        view.showApplicationList(Response);
                    }
                });
    }
}

可以看到当成功请求后直接交给View层进行展示。这里的View其实就是NetWorkView类型,因为权限为public因此我们可以直接拿到他。

public interface NetWorkView extends BaseView{
    //显示从网络获取过来的信息
    void showApplicationList(UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>> Response);
}

然后最后看看Activity中的操作与程序结构。

public class NetWorkActivity extends MvpActivity<NetWorkView,NetWorkPresenter> implements baseActivityInterface,NetWorkView {
      private RecyclerView mRecyclerView;
      private String code;
      private List<UserguideSoftConfig>data=new ArrayList<>();
      private ToolBarView toolBarView;
      private CompositeDisposable compositeDisposable=new CompositeDisposable();
    @Inject
    GenerateAdapter generateAdapter;
    @Inject
    MyToast myToast;
    @Inject
    ActivityOperate activityOperate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_net_work);
        baseActivityInterface =this;//拿到引用
        initView();
        inject();
        Events();
        initAdapter();
        Config();
    }
//启动业务调用
    private void Events() {
        presenter.getData(new PageParmForm(Constant.orderStr,Constant.pageNum,Constant.pageSize),NetWorkActivity.this);
    }


    private void inject() {
        DaggercommonComponent.builder()
                .appComponent(MyApp.getMyApp().getAppComponent())
                .commonModule(new commonModule())
                .build()
                .inject(this);
    }

    public void Config(){
        toolBarView.setNavigationTip(Constant.Toolbar_Title);
    }
    public void initData(){
        new NetRepository().getApplication(new PageParmForm(Constant.orderStr,Constant.pageNum,Constant.pageSize))
        .compose(this.<UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>>>bindUntilEvent(ActivityEvent.DESTROY))//指定订阅再destroy的时候呢,取消订阅
        .subscribe(new BaseObserver<UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>>>(NetWorkActivity.this) {
            @Override
            public void onError(ExceptionHandle.ResponseException exception) {
                myToast.showToast(NetWorkActivity.this,exception.getMessage());

            }
            @Override
            public void onNext(UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>> Response) {
                data=Response.getData().getList();
                code=Response.getCode();
                generateAdapter.setData(data);
                generateAdapter.notifyDataSetChanged();
            }
        });
    }
    public void initAdapter(){
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
        gridLayoutManager.setOrientation(GridLayoutManager.VERTICAL);
        generateAdapter.setData(data);
        generateAdapter.notifyDataSetChanged();//更新数据
        mRecyclerView.setAdapter(generateAdapter);
        mRecyclerView.setLayoutManager(gridLayoutManager);
        //设置监听事件
        mRecyclerView.addOnItemTouchListener(new RecyclerViewClickListener(NetWorkActivity.this, mRecyclerView, new RecyclerViewClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position, View ItemView) {
                Constant.url=data.get(position).getDetailUrl();
                generateAdapter.notifyItemChanged(position);//刷新点击事件,展示selector
                activityOperate.LunchActivity(NetWorkActivity.this,WebActivity.class);
            }
            @Override
            public void onItemLongClick(View view, int position, View ItemView) {

            }
        }));
    }
    public void initView(){
        mRecyclerView = findViewById(R.id.mRecyclerView);
        toolBarView=findViewById(R.id.toolBarView);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(compositeDisposable!=null&&!compositeDisposable.isDisposed()){
            compositeDisposable.dispose();//取消订阅
        }
    }

    @Override
    public NetWorkPresenter initPresenter() {
        return new NetWorkPresenter(this);
    }

    @Override
    public void reConnect() {
        myToast.showToast(NetWorkActivity.this,"已经开始重新连接!!");
        initData();
    }

    @Override
    public void showApplicationList(UserGuideSoftConfigRForm<UserGuideSoftConfigPageInfo<List<UserguideSoftConfig>>> Response) {
        data=Response.getData().getList();
        generateAdapter.setData(data);
        generateAdapter.notifyDataSetChanged();//更新数据
    }
    @Override
    public void showProgress() {

    }
    @Override
    public void hideProgress() {

    }
    @Override
    public void toast(String msg) {
        myToast.showToast(NetWorkActivity.this,msg);
    }
}

这里我们直接用Presenter去实现业务,紧接着View层展示,可以看到我们不仅实现了View层,还实现了baseActivityInterface,这里主要时想把重新连接服务器的请求写在这里。
好了整个Demo是先了用MVP的方式处理业务,还包括监听网络状态,网络恢复后重新发起请求等功能,这里我们是结合广播与RxBus来实现的。当然不喜欢尽情拍砖。

最后附上RxBus:

public class RxBus {
    private static volatile RxBus instance;
    private final Relay<Object> mBus;

    public RxBus() {
        this.mBus = PublishRelay.create().toSerialized();
    }

    public static RxBus getInstance() {
        if (instance == null) {
            synchronized (RxBus.class) {
                if (instance == null) {
                    instance = Holder.BUS;
                }
            }
        }
        return instance;
    }
    public void post(Object obj) {
        mBus.accept(obj);
    }

    public <T> Observable<T> toObservable(Class<T> tClass) {
        return  mBus.ofType(tClass);
    }

    public Observable<Object> toObservable() {
        return mBus;
    }

    public boolean hasObservers() {
        return mBus.hasObservers();
    }

    private static class Holder {
        private static final RxBus BUS = new RxBus();
    }

    public void unregister(Disposable disposable) {
        if (disposable != null && !disposable.isDisposed()) {
            disposable.dispose();
        }
    }
}

MessageEvent:

public class MessageEvent {

    String netStateMessage;
    boolean lastConnect=true;
    boolean isConnect;

    public boolean isLastConnect() {
        return lastConnect;
    }

    public void setLastConnect(boolean lastConnect) { this.lastConnect = lastConnect; }

    public boolean isConnect() {
        return isConnect;
    }

    public void setConnect(boolean connect) {
        isConnect = connect;
    }


    public MessageEvent(String netStateMessage,boolean lastConnect,boolean isConnect) {
        this.netStateMessage = netStateMessage;
        this.lastConnect=lastConnect;
        this.isConnect=isConnect;
    }

    public String getNetStateMessage() {
        return netStateMessage;
    }

    public void setNetStateMessage(String netStateMessage) {
        this.netStateMessage = netStateMessage; }
}

相关文章

网友评论

  • 0c997e0e2f27:rxjava了解下
    耀东wang:@喜欢吃猪蹄 响应式应答,可以轻松实现线程调度,一般配合Retrofit比较好用。

本文标题:使用BaseActivity+RxBus+BroadCastRe

本文链接:https://www.haomeiwen.com/subject/jdilvftx.html