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; }
}
网友评论