Android Mvc 模式
1.Mvc 介紹
?? Model-View-Controller(模型-視圖-控制器) 模式,這種模式用于應用程序的分層開發。
?? model:模型層主要是處理數據的,主要進行網絡請求,復雜的數據操作
?? view:視圖層xml 負責數據的顯示,主要是xml,View負責
?? controller:控制層處理用戶交互的部分,負責從視圖層獲取數據傳遞給模型層進行處理activity,Fragment和Adapter充當這個角色
如圖:
2.Android中demo
(1).代碼的目錄結構:
(2).model層:
public interface GetDataModelImpl {public void getData(String url, GetDataListener listener); } public class GetDataModel implements GetDataModelImpl {@Overridepublic void getData(String url, final GetDataListener listener){OkHttpClient client = new OkHttpClient(final Request request = new Request.Builder().url(url).addHeader("Content-Type","application/json").build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {listener.onFail();} ?@Overridepublic void onResponse(Call call, final Response response) throws IOException {final String resultStr = response.body().string();Handler mainHandler = new Handler(Looper.getMainLooper());mainHandler.post(new Runnable() {@Overridepublic void run() {//已在主線程中,更新UIif(response.isSuccessful()){//回調的方法執行在子線程。listener.onSuccess(resultStr);}else{listener.onFail();}}}); ? ?} ? ? ?});} }(3).view層
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"> ?<Buttonandroid:id="@+id/bt0"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="mvc1獲取數據"></Button><Buttonandroid:id="@+id/bt1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="mvc2獲取數據(變相的)"></Button><Buttonandroid:id="@+id/bt2"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="沒有用mvc模式的"></Button><TextViewandroid:id="@+id/tv"android:layout_width="fill_parent"android:layout_height="fill_parent"android:text="返回的結果"></TextView> ? </LinearLayout>(4).controller層
public class MainActivity extends FragmentActivity implements GetDataListener {private GetDataModelImpl getDataModel;private Button bt0;private Button bt1;private Button bt2;private TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bt0 = (Button)findViewById(R.id.bt0);bt1 = (Button)findViewById(R.id.bt1);bt2 = (Button)findViewById(R.id.bt2);tv = (TextView)findViewById(R.id.tv); ?bt0.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String url = "https://www.baidu.com/";getDataModel.getData(url,MainActivity.this); ?}});bt1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//換一種形態的mvc模式這個時候只不過是沒有回調lister,但是方法返回值里面有也屬于mvc模式int number = UtilTools.parseInt("2");Toast.makeText(getApplicationContext(),"獲取的數據"+ number,Toast.LENGTH_LONG).show();}});bt2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//沒有mvc模式 數據處理的能力都在activity層也就是Controller層//這樣造成activity 有控制層的能力也有model層的數據處理的能力,導致activity代碼量很大String url = "https://www.baidu.com/";getData(url,MainActivity.this);}});if(getDataModel == null){getDataModel = new GetDataModel();}} ?@Overridepublic void onSuccess(String data) {if(!TextUtils.isEmpty(data)){tv.setText(data);}else{tv.setText("請求的結果為空");} ?} ?@Overridepublic void onFail() {tv.setText("---請求的結果失敗--");}public void getData(String url, final GetDataListener listener){OkHttpClient client = new OkHttpClient();final Request request = new Request.Builder().url(url).addHeader("Content-Type","application/json").build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {listener.onFail();} ?@Overridepublic void onResponse(Call call, final Response response) throws IOException {final String resultStr = response.body().string();Handler mainHandler = new Handler(Looper.getMainLooper());mainHandler.post(new Runnable() {@Overridepublic void run() {//已在主線程中,更新UIif(response.isSuccessful()){//回調的方法執行在子線程。listener.onSuccess(resultStr);}else{listener.onFail();}}}); ? ?} ? ? ?});} }(5).git 下載地址GitHub - wyc1411162011/MvcDemo: mvc模式的實例
3.優缺點總結:
優點:mvc采取分層結構結構清晰明了,各個層級分工明確耦合性低
缺點:(1).mvc模式activity充當view和controller這兩種角色,隨著項目擴大activity里面代碼會很多,不適用 復雜的頁面
?????????? (2).view層和model層有交互,有代碼的耦合。
?????????? (3).model層數據操作沒有和activity生命周期綁定,activity結束model數據處理還會有回調,容易引起context的內存溢出
4.問題及解答:
?????????? (1).model層封裝了一層接口為什么要用接口直接的類不是更簡單嗎?
?????????? 答案:個人理解這就是面向接口編程,為了以后好擴展,比如獲取數據的方法變了,直接新加一個實現接口的類,在activity里面換點指向的新對象就行了,符合設計模式里面的開關原則,對內修改關閉,對外擴展開放的原則,鬼知道這個玩意以后會不會,為以后擴展留好后路。
?????????? (2).如果請求方式從okhttp換成retifit怎么辦?
??????????? 答案:網絡請求,最好封裝一層,在model層請求數據,不要用具體的okhttp或者retifit 用自己封裝統一的請求處理,方便以后的全局替換,比如以后又有嶄新的框架了。
?????????? (3).如果有多個model怎么辦 會有多個listener 邏輯處理很混亂?
?????????? 答案:這就要求listener 封裝的足夠通用,這個model能用,其他model也能用,項目封裝幾個通用的listener,讓足夠多的model 層使用。
總結
以上是生活随笔為你收集整理的Android Mvc 模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php捉迷藏,查看“蘑菇捉迷藏!”的源代
- 下一篇: 名帖236 俞和 行书《次韵韩伯清见寄之