思考: 其实 UC的代码 基本上就是这里提到的MVP模式. 不过MVP中 Activity成了一个单词的View, 而UC用有抽象了一个Window
1. 明确需求,界面如下:可存,可根据id读取数据。
包结构图
2. 建立bean
[java] view plaincopyprint?
- 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;
- }
- }
3. 建立model(处理业务逻辑,这里指数据读写),先写接口,后写实现
[java] view plaincopyprint?
- public interface IUserModel {
- void setID(int id);
- void setFirstName(String firstName);
- void setLastName(String lastName);
- int getID();
- UserBean load(int id);// 通过id读取user信息,返回一个UserBean
- }
实现不在这里写了。
4. 建立view(更新ui中的view状态),这里列出需要操作当前view的方法,也是接口
[java] view plaincopyprint?
- public interface IUserView {
- int getID(); //Activity实现, 被P主动调用
- String getFristName();
- String getLastName();
- void setFirstName(String firstName);
- void setLastName(String lastName);
- }
5. 建立presenter(主导器,通过iView和iModel接口操作model和view),activity可以把所有逻辑给presenter处理,这样java逻辑就从手机的activity中分离出来。
[java] view plaincopyprint?
- 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());
- }
- }
6. activity中实现iview接口,在其中操作view,实例化一个presenter变量。
[java] view plaincopyprint?
- 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);
- }
- }
7. 所谓的mvp,即是(model-处理业务逻辑(主要是数据读写,或者与后台通信(其实也是读写数据)),view-处理ui控件,presenter-主导器,操作model和view)
8. 源码地址
http://download.youkuaiyun.com/detail/knxw0001/7983807
1. 需求,这个是《android开发必知的50个诀窍》一书中的mvp章节的需求。
在splash页面中,判断是否有网络连接,有则跳到下个页面,无则弹出一条消息通知用户,同时在检查网络是否正常的期间显示一个进度条。
2. 类目录结构
[java] view plaincopyprint?![在CODE上查看代码片]()
- 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();
- }
- }
7. 源码链接
http://download.youkuaiyun.com/detail/knxw0001/7990065