【轉載】android中MVP模式

轉載地址:http://blog.csdn.net/knxw0001/article/details/39637273#comments
1. 明確需求,界面如下:可存,可根據id讀取數據。

這裏寫圖片描述

包結構圖

這裏寫圖片描述
2. 建立bean

public class UserBean {  
     private String mFirstName;  
     private String mLastName;  

     public UserBean(String firstName, String lastName) {  
            this. mFirstName = firstName;  
            this. mLastName = lastName;  
     }  

     public String getFirstName() {  
            return mFirstName;  
     }  

     public String getLastName() {  
            return mLastName;  
     }  
}
  1. 建立model(處理業務邏輯,這裏指數據讀寫),先寫接口,後寫實現
    public interface IUserModel {  
         void setID(int id);  

         void setFirstName(String firstName);  

         void setLastName(String lastName);  

         int getID();  

         UserBean load(int id);// 通過id讀取user信息,返回一個UserBean  
    }  

實現不在這裏寫了。

  1. 建立view(更新ui中的view狀態),這裏列出需要操作當前view的方法,也是接口
public interface IUserView {  
     int getID();  

     String getFristName();  

     String getLastName();  

     void setFirstName(String firstName);  

     void setLastName(String lastName);  
} 
  1. 建立presenter(主導器,通過iView和iModel接口操作model和view),activity可以把所有邏輯給presenter處理,這樣java邏輯就從手機的activity中分離出來。
public class UserPresenter {  
     private IUserView mUserView;  
     private IUserModel mUserModel;  

     public UserPresenter(IUserView view) {  
            mUserView = view;  
            mUserModel = new UserModel();  
     }  

     public void saveUser( int id, String firstName, String lastName) {  
            mUserModel.setID(id);  
            mUserModel.setFirstName(firstName);  
            mUserModel.setLastName(lastName);  
     }  

     public void loadUser( int id) {  
           UserBean user = mUserModel.load(id);  
            mUserView.setFirstName(user.getFirstName()); // 通過調用IUserView的方法來更新顯示  
            mUserView.setLastName(user.getLastName());  
     }  
} 
  1. activity中實現iview接口,在其中操作view,實例化一個presenter變量。
public class MainActivity extends Activity implements OnClickListener,IUserView {  

     UserPresenter presenter;  
     EditText id,first,last;  
     @Override  
     protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
           setContentView(R.layout. activity_main);  

           findViewById(R.id. save).setOnClickListener( this);  
           findViewById(R.id. load).setOnClickListener( this);  
            id = (EditText) findViewById(R.id. id);  
            first = (EditText) findViewById(R.id. first);  
            last = (EditText) findViewById(R.id. last);  

            presenter = new UserPresenter( this);  
     }  

     @Override  
     public void onClick(View v) {  
            switch (v.getId()) {  
            case R.id. save:  
                 presenter.saveUser(getID(), getFristName(), getLastName());  
                 break;  
            case R.id. load:  
                 presenter.loadUser(getID());  
                 break;  
            default:  
                 break;  
           }  
     }  

     @Override  
     public int getID() {  
            return new Integer( id.getText().toString());  
     }  

     @Override  
     public String getFristName() {  
            return first.getText().toString();  
     }  

     @Override  
     public String getLastName() {  
            return last.getText().toString();  
     }  

     @Override  
     public void setFirstName(String firstName) {  
            first.setText(firstName);  
     }  

     @Override  
     public void setLastName(String lastName) {  
            last.setText(lastName);  
     }  

} 
  1. 所謂的mvp,即是(model-處理業務邏輯(主要是數據讀寫,或者與後臺通信(其實也是讀寫數據)),view-處理ui控件,presenter-主導器,操作model和view)

  2. 需求,這個是《android開發必知的50個訣竅》一書中的mvp章節的需求。
    在splash頁面中,判斷是否有網絡連接,有則跳到下個頁面,無則彈出一條消息通知用戶,同時在檢查網絡是否正常的期間顯示一個進度條。

  3. 類目錄結構
    這裏寫圖片描述
    3. model接口和實現  
    public interface INetConnect {  
         boolean isNetConnect( Context context);  
    }  
    public class NetConnect implements INetConnect {  

         @Override  
         public boolean isNetConnect(Context context) {  
                if (context != null) {  
                    ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                              .getSystemService(Context. CONNECTIVITY_SERVICE);  
                    NetworkInfo mNetworkInfo = mConnectivityManager  
                               .getActiveNetworkInfo();  
                     if (mNetworkInfo != null) {  
                          return mNetworkInfo.isAvailable();  
                    }  
               }  
                return false;  
         }  

    }  

    4. view接口  
    public interface ISplashView {  
         void showProcessBar();  
         void hideProcessBar();  
         void showNetError();  
         void startNextActivity();  
    }  

    5. presenter實現  
    public class SplashPresenter {  
         private INetConnect connect;  
         private ISplashView iView;  

         public SplashPresenter(ISplashView iView){  
                this. iView = iView;  
                connect = new NetConnect();  
         }  

         public void didFinishLoading(Context context){  
                iView.showProcessBar();  
                if( connect.isNetConnect(context)){  
                     iView.startNextActivity();  
               } else{  
                     iView.showNetError();  
               }  
                iView.hideProcessBar();  
         }  
    }  

    6.activity中代碼  
    public class MainActivity extends Activity implements ISplashView{  

         SplashPresenter presenter;  
         private ProgressDialog progressBar;  
         @Override  
         protected void onCreate(Bundle savedInstanceState) {  
                super.onCreate(savedInstanceState);  
               setContentView(R.layout. activity_main);  

                presenter = new SplashPresenter( this);  
         }  

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

         @Override  
         public void showProcessBar() {  
                if ( progressBar == null) {  
                     progressBar = new ProgressDialog( this);  
                     progressBar.setCancelable( true);  
                     progressBar.setCanceledOnTouchOutside( true);  
                     progressBar.setMessage( "更新數據中,請稍後" );  
               }  
                progressBar.show();  
         }  

         @Override  
         public void hideProcessBar() {  
                progressBar.hide();  
         }  

         @Override  
         public void showNetError() {  
               Toast. makeText(this, "暫無網絡", Toast.LENGTH_SHORT).show();  
         }  

         @Override  
         public void startNextActivity() {  
               Toast. makeText(this, "跳到下個activity", Toast.LENGTH_SHORT).show();  
         }  

    }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章