所谓的mvp,即是(model-处理业务逻辑(主要是数据读写,或者与后台通信(其实也是读写数据)),view-处理ui控件,presenter-主导器,操作model和view)
从其他博客盗个图贴出来,MVC和MVP的区别
官方的盗几句话,简单说下MVP的优点
我们模拟一个需求:
首先我们要进入一个Splash界面,Splash界面中,有一个ProgressBar控件和TextView控件
我们判断它是否有网络连接
1、如果有的话就隐藏 ProgressBar和跳转到MainActivity
2、如果没有网络的话则显示ProgressBar和TextView,TextView则提示用户No internet。
首先我们看下M层是如何接口写的,话说什么是M层,这个需求里面就是有没有网络啊
IConnectionStatus--代码里面积,简单粗暴,就一个是否在线的接口方法(当然你也可以定义成一个抽象类)
package com.example.mvp2;
public interface IConnectionStatus {
boolean isOnline();
}
上面一个干巴巴的接口,肯定需要实现把,实现啥?就是具体怎么样才算是在线,怎么样才算是不在线的代码
ConnectionStatus
package com.example.mvp2;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class ConnectionStatus implements IConnectionStatus {
public boolean isOnline() {
boolean networkAvailable = isNetworkAvailable(MvpApplication
.getApplication());
if (networkAvailable) {
return true;
} else {
return false;
}
}
private boolean isNetworkAvailable(Context con) {
ConnectivityManager cm = (ConnectivityManager) con
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm == null)
return false;
NetworkInfo netinfo = cm.getActiveNetworkInfo();
if (netinfo == null) {
return false;
}
if (netinfo.isConnected()) {
return true;
}
return false;
}
}
上面的具体实现网络在线,不在线代码中
private boolean isNetworkAvailable(Context con) 需要环境变量,可以哪里来呢?哎,这里我本来打算获取getContext之类的,但是没有依付Activity,(如果你有好的思路就给我留言,多谢啊) 我于是就从application里面获取的
MvpApplication
package com.example.mvp2;
import android.app.Application;
public class MvpApplication extends Application{
private static MvpApplication mApplication;
@Override
public void onCreate() {
super.onCreate();
MvpApplication.mApplication = this;
}
public static Application getApplication(){
return mApplication;
}
}
这里需要在mani里面配置下哦---android:name="com.example.mvp2.MvpApplication"
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mvp2"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="18"
android:targetSdkVersion="18" />
<application
android:name="com.example.mvp2.MvpApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".SplashActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity" >
</activity>
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
到此为止M层就算写好了。。。。。。。。。。。
接下来看V层---话说什么是M层,这个需求里面就是有网络,progress显示、隐藏的接口方法、
ISplashView
<span style="font-size:14px;">package com.example.mvp2;
public interface ISplashView {
void showProgress();
void hideProgress();
void showNoInetErrorMsg();
void moveToMainView();
} </span>
接下来看P层---话说什么是P层,就是将MV2层,结合起来的那一层,
SplashPresenter---代码比较简单,就是实现mv2层的业务逻辑的整合
package com.example.mvp2;
public class SplashPresenter {
private ISplashView mView;
public void setView(ISplashView view) {
this.mView = view;
}
protected ISplashView getView() {
return mView;
}
public SplashPresenter() {
this(new ConnectionStatus());
}
private IConnectionStatus mConnectionStatus;
public SplashPresenter(IConnectionStatus connectionStatus) {
mConnectionStatus = connectionStatus;
}
public void didFinishLoading() {
ISplashView view = getView();
if (mConnectionStatus.isOnline()) {
//调用实现的接口方法。。。。。。implements ISplashView
view.hideProgress();
try {
Thread.sleep(1000);
view.moveToMainView();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
view.showProgress();
view.showNoInetErrorMsg();
}
}
}
接下来就看主界面的代码了 ,首先看布局文件
splash.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.mvp2.MainActivity" >
<TextView
android:id="@+id/splash_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="29dp"
android:layout_marginTop="41dp"
android:text="TextView" />
<ProgressBar
android:id="@+id/splash_progress_bar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/splash_text"
android:layout_marginTop="28dp"
android:layout_toRightOf="@+id/splash_text" />
</RelativeLayout>
SplashActivity
package com.example.mvp2;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
public class SplashActivity extends Activity implements ISplashView {
private TextView mTextView;
private ProgressBar mProgressBar;
private SplashPresenter mPresenter = new SplashPresenter();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
mPresenter.setView(this);
mTextView = (TextView) findViewById(R.id.splash_text);
mProgressBar = (ProgressBar) findViewById(R.id.splash_progress_bar);
}
@Override
protected void onResume() {
super.onResume();
mPresenter.didFinishLoading();
}
public void showProgress() {
mProgressBar.setVisibility(View.VISIBLE);
Log.e("TAG", "mProgressBar VISIBLE");
}
public void hideProgress() {
mProgressBar.setVisibility(View.INVISIBLE);
}
public void showNoInetErrorMsg() {
mTextView.setText("No internet");
}
@Override
public void moveToMainView() {
startActivity(new Intent(this, MainActivity.class));
}
}
另外如果网络可用的话,就直接跳转到MainActivity界面了---加载一个布局即可
package com.example.mvp2;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
最后贴出那些MainActivity的布局文件
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.mvp2.MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>