Android---MVP设计模式初级(一)

点击打开链接,下载demo......

所谓的mvp,即是(model-处理业务逻辑(主要是数据读写,或者与后台通信(其实也是读写数据)),view-处理ui控件,presenter-主导器,操作model和view)


从其他博客盗个图贴出来,MVC和MVP的区别

官方的盗几句话,简单说下MVP的优点

1、模型与视图完全分离,我们可以修改视图而不影响模型
2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部
3、我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)


我们模拟一个需求:

首先我们要进入一个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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值