AndroidLifecycle對MVP模式進一步”解耦“
傳統的MVP模式中,不可避免要在V中的生命週期中要做很多業務操作,導致actitvity等還是臃腫不堪。因此,谷歌在2017年的IO大會上推出了Lifecycle框架,希望借Lifecycle將activity的生命週期事件傳遞給Presenter,讓Presenter承擔部分業務,從而降低了Activity的複雜度。lifecycle本身就是一個依賴注入的框架,具體的原理和原始碼也比較簡單,這裡就不做原始碼分析了,廢話不多說,直接上程式碼
傳統的MVP模式中,我們依然要在Activity的各個生命週期內,完成相關的操作,如廣播註冊登出,AIDL連線釋放,地圖的SDK相關呼叫,相關資源的釋放等
舉個例子,請看下面寫的傳統的Activity程式碼
package com.example.helang.lifecycledemo;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
public class OldPresenterMainActivity extends AppCompatActivity {
private Presenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scrolling);
presenter = new Presenter(this);
presenter.doWork();
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisters();
}
/**
* 註冊廣播
* (忽略具體的實現)
*/
private void registers(){
// Intent intent = new Intent();
// registerReceiver("xxx","xxx");
}
/**
* 登出廣播
*/
private void unregisters(){
// unregisterReceiver(xxx);
}
}
如果是要做地圖相關的開發,那麼Activity中的各個生命週期的內的程式碼將會很多,會讓Activity承擔各種非UI操作的程式碼
但是,利用LifecycleObserver,封裝一個IPresenter的介面,方便Presenter來實現
package com.example.helang.lifecycledemo;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.OnLifecycleEvent;
import android.support.annotation.NonNull;
/**
*
* lifecycle observer
* Created by helang on 2018/6/19.
*/
public interface IPresenter extends LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
void onCreate(@NonNull LifecycleOwner owner);
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
void onResume(@NonNull LifecycleOwner owner);
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
void onPause(@NonNull LifecycleOwner owner);
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
void onStop(@NonNull LifecycleOwner owner);
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
void onDestroy(@NonNull LifecycleOwner owner);
}
### 下面就是處理後的Presenter
package com.example.helang.lifecycledemo;
import android.arch.lifecycle.LifecycleOwner;
import android.content.Context;
import android.support.annotation.NonNull;
import android.util.Log;
/**
* 其實也要基於MVP來做的,這樣解耦才能更加好,同時也可以更好地處理MVP中的生命週期的問題
* Presenter承擔更多業務上的操作,但是,也不易把過多的業務轉到Presenter中,不然會造成Presenter變成第二個"Activity"
* Created by helang on 2018/6/19.
*/
public class Presenter implements IPresenter {
private static final String TAG = "Presenter";
private Model model = new Model();
private Context context;
public Presenter(Context context) {
this.context = context;
}
public void doWork(){
model.startWork();
}
/**
* 繫結遠端服務
*/
private void bindService(){
//連線Aidl服務,程式碼我就不寫了
Log.d(TAG,"bindService");
}
/**
* 解綁遠端服務
*/
private void unbindService(){
//斷開Aidl服務
Log.d(TAG,"unbindService");
}
/**
* 比如註冊動態廣播等操作可以轉移到Presenter中,進一步降低Activity的複雜性
*/
private void register(){
// context.registerReceiver(null,null);
}
private void unregister(){
// context.unregisterReceiver(null);
}
/**
* 建立資源等
* @param owner
*/
@Override
public void onCreate(@NonNull LifecycleOwner owner) {
Log.e(TAG,"onCreate");
register();
bindService();
}
@Override
public void onResume(@NonNull LifecycleOwner owner) {
}
@Override
public void onPause(@NonNull LifecycleOwner owner) {
}
@Override
public void onStop(@NonNull LifecycleOwner owner) {
}
/**
* 釋放資源等
* @param owner
*/
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
Log.e(TAG,"onDestroy");
model.endWork();
unregister();
unbindService();
}
}
最終的Activity
package com.example.helang.lifecycledemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
/**
* 利用MVP加lifeCycle就可以解耦更加徹底,減少了Activity中的程式碼量和各種重複的程式碼
* 同時也可以更好地處理MVP中的生命週期的問題,防止發生記憶體洩漏
*/
public class MainActivity extends AppCompatActivity {
private Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scrolling);
presenter = new Presenter(this);
getLifecycle().addObserver(presenter);//為Lifecycle註冊生命週期監聽器
presenter.doWork();
}
}
最終的Activity的確少了很多程式碼,它也只需要關注和頁面的顯示,操作;其他的生命週期之內的事情交給Presenter來處理即可
總結:Android的Lifecycle程式碼很簡單,更多的像是一個語法糖,但是,也不要把所有業務處理都丟給Presenter,也不要為了解耦而解耦,一定要根據自己專案的實際情況和發展,來決定自己的專案該怎麼做,希望能夠和大家一起成長
程式碼地址:https://github.com/helang1991/LifeCycleDemo
相關文章
- 如何優雅的對UITableView進行解耦UIView解耦
- mvp模式MVP模式
- 微服務解耦設計模式 - Neeraj微服務解耦設計模式
- 對前後端解耦的理解後端解耦
- Spring:工廠模式哪裡解耦了?Spring模式解耦
- Spring專案中用了這種解耦模式,經理對我刮目相看Spring解耦模式
- Android MVP模式從入門到進門(一)AndroidMVP模式
- 詳解command設計模式,解耦操作和回滾設計模式解耦
- 解耦解耦
- Android人臉識別app——基於Face++,MVP+Retofit+RxJava+Dagger高度解耦AndroidAPPMVPRxJava解耦
- 命令模式-接收者與執行者解耦和模式解耦
- AppDelegate解耦APP解耦
- Spring 實現策略模式--自定義註解方式解耦if...elseSpring模式解耦
- MVC模式和MVP模式的區別MVC模式MVP
- 進一步詳解Wsgi
- 分散式系統中的解耦模式:概要事件 - mathiasverraes分散式解耦模式事件
- MVP應用架構模式MVP應用架構模式
- 分散式系統中的解耦模式:領域查詢 - mathiasverraes分散式解耦模式
- 分散式系統中的解耦模式:隔離事件層 - mathiasverraes分散式解耦模式事件
- Java設計模式-16、命令模式-請求傳送者與接收者解耦Java設計模式解耦
- 基於AOP的MVP框架(三)GoMVP進階註解MVP框架Go
- 基於AOP的MVP框架(二)GoMVP進階註解MVP框架Go
- 巧用Fragment解耦onActivityResultFragment解耦
- 淺談MVC/MVP/MVVM模式(概述)MVCMVPMVVM模式
- Android MVP模式專案實戰AndroidMVP模式
- iOS MVP模式重構實踐iOSMVP模式
- iosswift實現簡單MVP模式iOSSwiftMVP模式
- iOS開發-MVP架構模式iOSMVP架構模式
- Spring Boot Event 觀察者模式,輕鬆實現業務解耦!Spring Boot模式解耦
- MVC,MVP 和 MVVM 模式如何選擇?MVCMVPMVVM模式
- 一個簡單的MVP模式案例MVP模式
- iOS-模組解耦iOS解耦
- Spring 解耦反射建立物件Spring解耦反射物件
- 一步一步理解命令模式模式
- MVP釋出後,下一步該怎麼辦MVP
- 對Node.js非同步的進一步理解Node.js非同步
- 小遊戲——金庸奇俠傳(JAVA,對物件導向的進一步瞭解)遊戲Java物件
- Android MVP模式--簡單實用示例 BMIAndroidMVP模式