標籤:前言 ide int sub converter pos -- new ring
前言說明
在實戰項目及學習中來總結一下Android端項目構架
包括MVC、MVP、MVVM,主要針對移動Android端
該篇以Android平台使用者登入狀態例子,用代碼來描述構架模式
代碼主要作理解,所以可能不完整,因為去掉一些精簡方便說明
目錄
1.構架基礎
2.橫向構架模型
3.縱向構架流程
4.使用者登入例子
4. 使用者登入例子
公用代碼
NetHelper網路通訊類
使用Retrofit+RxJava技術
NetHelper { private static String baseUrl = "http://xxx/"; private static Retrofit retrofit = null; private static OkHttpClient okHttpClient = null; private static NetService netService; static { OkHttpClient.Builder okBuilder = OkHttpClient.Builder(); okBuilder.addInterceptor(new HttpLoggingInterceptor() .setLevel(HttpLoggingInterceptor.Level.BODY)); okHttpClient = okBuilder.build(); Retrofit.Builder builder = new Retrofit.Builder(); retrofit = builder.baseUrl(baseUrl) .client(sOkHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); netService = sRetrofit.create(NetService.class); } public static NetService getNetService() { reutrn netService; } public interface NetService { @POST("login") Observable<String> login(@Query("username") username, @Query("userpass") userpass); }}
使用者業務UserBiz( model層)
UserBiz{ Observable<String> login(String username, String userpass) { return NetHelper.getNetService.login(username, userpass); }}
MVC例子代碼
布局檔案
<Layout> <TextView id="username"/> <TextView id="userpass"/> <Button id="button" /></Layout>
登入介面LoginActivity( view層)
LoginActivity extends Activity{ String username; String userpass; void onCreate(Bundle bdle) { setContentView(login_layout); username = findById(username); userpass = findById(userpass); findById(button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { login(); } }); } void login() { new UserManager() .login(username, userpass) .subscribe(new Action1<String>() { @Override public void call(String loginResultString) { if(loginResultString) { Toast.makeText(getApplicationContext(), username() + "--登入成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), username() + "--登入失敗", Toast.LENGTH_SHORT).show(); } } }; }}
使用者管理UserManager( controller層)
UserManager{ Observable<String> login(String username, String userpass) { return new UserBiz().login(username, userpass) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); }}
使用者業務UserBiz( model層)
查看公用代碼
MVP例子代碼
布局檔案
<Layout> <TextView id="username"/> <TextView id="userpass"/> <Button id="button" /></Layout>
登入介面LoginActivity( view層)
LoginActivity extends Activity impl IUserView{ String username; String userpass; void onCreate(Bundle bdle) { setContentView(login_layout); username = findById(username); userpass = findById(userpass); findById(button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new UserPresenter(this).login() } }); } @Override String getUserName() { return username; } @Override String getPassword() { return userpass; } @Override void showSuccess() { Toast.makeText(getApplicationContext(), username() + "--登入成功", Toast.LENGTH_SHORT).show(); } @Override void showFailure() { Toast.makeText(getApplicationContext(), username() + "--登入失敗", Toast.LENGTH_SHORT).show(); }}
使用者視圖介面IUserView( view層)
interface IUserView{ String getUserName(); String getUserPass(); void showSuccess(); void showFailure();}
使用者調配UserPresenter( presenter層)
UserPresenter{ IUserView userView; UserPresenter(IUserView userView) { this.userView = userView; } void login() { new UserBiz().login(userView.getUserName(), userView.getUserPass()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String loginResultString) { if(loginResultString) { userView.showSuccess(); } else { userView.showFailure(); } } }; }}
使用者業務UserBiz( model層)
查看公用代碼
MVVM例子代碼
布局檔案
<layout> <data> <name="userViewModel" type="com.test.viewModel.UserViewModel" /> </data> <layout> <TextView id="username"/> <TextView id="userpass"/> <Button id="button" onclick="@{userViewModel.login}" /> </layout></layout>
登入介面LoginActivity( view層)
LoginActivity extends Activity{ void onCreate(Bundle bdle) { MainBinding binding = DataBindingUtil.setContentView(this, login_layout); binding.setViewModel(new UserViewModel(binding, this)); }}
使用者視圖模型UserViewModel( viewModel層)
UserViewModel{ String username; String userpass; Context context; UserViewModel(MainBinding mainBinding, Context context) { this.context = context; username = mainBinding.username.getText().toString.trim(); userpass = mainBinding.userpass.getText().toString.trim(); } void login() { new UserBiz().login(username, userpass) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String loginResultString) { if(loginResultString) { Toast.makeText(context, username + "--登入成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, username + "--登入失敗", Toast.LENGTH_SHORT).show(); } } }; }}
使用者業務UserBiz( model層)
查看公用代碼
MVC、MVP、MVVM模式對比總結(4)使用者登入例子