真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何Android項(xiàng)目中實(shí)現(xiàn)一個(gè)MVP架構(gòu)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)如何Android項(xiàng)目中實(shí)現(xiàn)一個(gè)MVP架構(gòu),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

在安新等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),成都全網(wǎng)營銷,外貿(mào)網(wǎng)站建設(shè),安新網(wǎng)站建設(shè)費(fèi)用合理。

1、概述

傳統(tǒng)的Android開發(fā)架構(gòu)一般是MVC模式,

  • Model:業(yè)務(wù)邏輯和實(shí)體模型
  • View:對(duì)應(yīng)于布局文件
  • Controllor:對(duì)應(yīng)于Activity
     

單獨(dú)從邏輯看起來非常好,與我們做Web開發(fā)時(shí),開發(fā)模式類似,但在實(shí)際開發(fā)中,View對(duì)應(yīng)于布局文件,實(shí)際上關(guān)于該布局文件中的數(shù)據(jù)綁定的操作,事件處理的代碼都在Activity中,Activity既像View又像Controller(MVVP架構(gòu)中包括數(shù)據(jù)綁定),導(dǎo)致Activity中職責(zé)太重,耦合度大。修改和維護(hù)起來非常麻煩。

如何Android項(xiàng)目中實(shí)現(xiàn)一個(gè)MVP架構(gòu)

2、MVP介紹

如何Android項(xiàng)目中實(shí)現(xiàn)一個(gè)MVP架構(gòu)

MVP架構(gòu)中,View 對(duì)應(yīng)于Activity,負(fù)責(zé)View的繪制以及與用戶交互

Model 依然是業(yè)務(wù)邏輯和實(shí)體模型,Presenter 負(fù)責(zé)完成View于Model間的交互。

(1)Model層

模型層之中做的工作是具體業(yè)務(wù)邏輯處理的實(shí)現(xiàn),都伴隨著程序中各種數(shù)據(jù)的處理,復(fù)雜一些的就需要實(shí)現(xiàn)一個(gè)Interface來松耦合了。

(2)View層

視圖層體現(xiàn)的很輕薄,負(fù)責(zé)顯示數(shù)據(jù)、提供友好界面跟用戶交互就行。MVP下Activity和Fragment體現(xiàn)在了這一 層,Activity一般也就做加載UI視圖、設(shè)置監(jiān)聽再交由Presenter處理的一些工作,所以也就需要持有相應(yīng)Presenter的引用。處理一些基本UI邏輯,判斷是否為空。

(3)Presenter層

Presenter這一層處理著程序各種邏輯的分發(fā),收到View層UI上的反饋命令、定時(shí)命令、系統(tǒng)命令等指令后分發(fā)處理邏輯交由Model層做具體的業(yè)務(wù)操作。

MVP架構(gòu)和MVC架構(gòu)區(qū)別:

如何Android項(xiàng)目中實(shí)現(xiàn)一個(gè)MVP架構(gòu)

MVC中是允許Model和View進(jìn)行交互的,而MVP中,Model與View之間的交互由Presenter完成。還有一點(diǎn)就是Presenter與View之間的交互是通過接口的。

3、MVP實(shí)現(xiàn)

百說不如一做。實(shí)現(xiàn)一個(gè)簡(jiǎn)單的登錄操作。

項(xiàng)目結(jié)構(gòu)如下:

如何Android項(xiàng)目中實(shí)現(xiàn)一個(gè)MVP架構(gòu)

(1)Model層實(shí)現(xiàn)

首先實(shí)現(xiàn)User實(shí)體類:

package com.chunsoft.blogcontent.bean;

/**
 * Developer:chunsoft on 2017/2/7 11:19
 * Content:實(shí)體類
 */

public class User {

 private String username;
 private String password;

 public String getUsername() {
  return username;
 }

 public void setUsername(String username) {
  this.username = username;
 }

 public String getPassword() {
  return password;
 }

 public void setPassword(String password) {
  this.password = password;
 }
}

model層主要實(shí)現(xiàn)業(yè)務(wù)邏輯處理,在本文案例中,主要邏輯處理就是登錄,抽取了一個(gè)接口和一個(gè)實(shí)現(xiàn)類,在login操作,模擬登錄操作,Thread.sleep()模擬耗時(shí),由于是耗時(shí)操作,通過一個(gè)回調(diào)接口通知登錄狀態(tài)。

model層接口:

package com.chunsoft.blogcontent.model;

import com.chunsoft.blogcontent.RequestCallback;
import com.chunsoft.blogcontent.bean.User;

/**
 * Developer:chunsoft on 2017/2/7 11:30
 * Email:chun_soft@qq.com
 * Content:Model層主要處理業(yè)務(wù)方法和實(shí)體模型
 */

public interface LoginModel {
 void login(String username, String password, RequestCallback callback);
}

model層接口實(shí)現(xiàn):

package com.chunsoft.blogcontent.model.impl;

import com.chunsoft.blogcontent.RequestCallback;
import com.chunsoft.blogcontent.bean.User;
import com.chunsoft.blogcontent.model.LoginModel;

/**
 * Developer:chunsoft on 2017/2/7 11:31
 * Content:Model層的實(shí)現(xiàn)
 */

public class LoginModelImpl implements LoginModel{
 @Override
 public void login(final String username, final String password, final RequestCallback callback) {
  //模仿登錄操作
  new Thread() {
   @Override
   public void run() {
    try {
     Thread.sleep(2*1000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    if ("chunsoft".equals(username) && "123456".equals(password)) {
     User user = new User();
     user.setUsername(username);
     user.setPassword(password);
     callback.onSuccess(user);
    } else {
     callback.onFailure("登錄失敗");
    }
   }
  }.start();
 }
}

回調(diào)接口:

package com.chunsoft.blogcontent;

/**
 * Developer:chunsoft on 2017/2/7 11:35
 * Content:回調(diào)接口
 */

public interface RequestCallback {
 void onSuccess(T datas);
 void onFailure(String msg);
}

(2)View層實(shí)現(xiàn)

對(duì)于View層接口定義,首先考慮功能上的操作,然后考慮:

  • 該操作需要什么?(getUserName等)
  • 該操作的結(jié)果,對(duì)應(yīng)的反饋?(toMainActivity等)
  • 該操作過程中交互友好?( showLoading)

view層接口:

package com.chunsoft.blogcontent.view;

import com.chunsoft.blogcontent.bean.User;

/**
 * Developer:chunsoft on 2017/2/7 11:54
 * Email:chun_soft@qq.com
 * Content:view層接口
 */

public interface LoginView {
 String getUserName();
 String getPassword();

 void showLoading();
 void hideLoading();

 void toMainActvity(User user);
 void showFailedError(String msg);
}

view層實(shí)現(xiàn),其實(shí)就是Activity,可以看到Activity的代碼量大大減少,且邏輯清晰:

package com.chunsoft.blogcontent;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.chunsoft.blogcontent.bean.User;
import com.chunsoft.blogcontent.presenter.impl.LoginPresenterImpl;
import com.chunsoft.blogcontent.view.LoginView;

public class MainActivity extends AppCompatActivity implements LoginView{

 private EditText et_mobile,et_password;
 private ProgressBar pb;
 private Button btn_login;

 private LoginPresenterImpl mLoginPresenter = new LoginPresenterImpl(this);

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  et_mobile = (EditText) findViewById(R.id.et_mobile);
  et_password = (EditText) findViewById(R.id.et_password);
  pb = (ProgressBar) findViewById(R.id.pb);
  btn_login = (Button) findViewById(R.id.btn_login);

  btn_login.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    mLoginPresenter.login();
   }
  });
 }

 @Override
 public String getUserName() {
  return et_mobile.getText().toString();
 }

 @Override
 public String getPassword() {
  return et_password.getText().toString();
 }

 @Override
 public void showLoading() {
  pb.setVisibility(View.VISIBLE);
 }

 @Override
 public void hideLoading() {
  pb.setVisibility(View.INVISIBLE);
 }

 @Override
 public void toMainActvity(User user) {
  Toast.makeText(this,user.getUsername() + "登錄成功",Toast.LENGTH_SHORT).show();
 }

 @Override
 public void showFailedError(String msg) {
  Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
 }
}

(3)Presenter層實(shí)現(xiàn)

Presenter層是Model層和View層的橋梁,本文中依然抽象出一個(gè)接口和一個(gè)實(shí)現(xiàn)類,定義時(shí)主要看該功能有什么操作,例如,登錄:

Presenter接口:

package com.chunsoft.blogcontent.presenter;

/**
 * Developer:chunsoft on 2017/2/7 11:49
 * Content:Presenter層接口
 */
public interface LoginPresenter {
  void login();
}

Presenter層實(shí)現(xiàn):

package com.chunsoft.blogcontent.presenter.impl;

import android.os.Handler;

import com.chunsoft.blogcontent.RequestCallback;
import com.chunsoft.blogcontent.bean.User;
import com.chunsoft.blogcontent.model.LoginModel;
import com.chunsoft.blogcontent.model.impl.LoginModelImpl;
import com.chunsoft.blogcontent.presenter.LoginPresenter;
import com.chunsoft.blogcontent.view.LoginView;


/**
 * Developer:chunsoft on 2017/2/7 11:50
 * Content:Presenter層實(shí)現(xiàn)
 */

public class LoginPresenterImpl implements LoginPresenter {

 private LoginView loginView;
 private LoginModel loginModel;

 private Handler mHandler = new Handler();

 //在構(gòu)造函數(shù)中初始化
 public LoginPresenterImpl(LoginView loginView) {
  this.loginModel = new LoginModelImpl();
  this.loginView = loginView;
 }

 @Override
 public void login() {
  loginView.showLoading();
  loginModel.login(loginView.getUserName(), loginView.getPassword(), new RequestCallback() {
   @Override
   public void onSuccess(final User datas) {
    //登錄成功
    mHandler.post(new Runnable() {
     @Override
     public void run() {
      loginView.toMainActvity(datas);
      loginView.hideLoading();
     }
    });
   }

   @Override
   public void onFailure(final String msg) {
    //登錄失敗
    mHandler.post(new Runnable() {
     @Override
     public void run() {
      loginView.showFailedError(msg);
      loginView.hideLoading();
     }
    });
   }
  });
 }
}

Presenter層是Model層和View層的橋梁,Model層和View層不直接通信,所以Presenter層需要Model層和View層的實(shí)現(xiàn)類,從View層中獲取重要參數(shù),交給Model 層調(diào)用業(yè)務(wù)邏輯處理,執(zhí)行后的結(jié)果和反饋再交給View層去展示。

上述就是小編為大家分享的如何Android項(xiàng)目中實(shí)現(xiàn)一個(gè)MVP架構(gòu)了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


本文題目:如何Android項(xiàng)目中實(shí)現(xiàn)一個(gè)MVP架構(gòu)
轉(zhuǎn)載源于:http://weahome.cn/article/giedds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部