架构组件 — Lifecycle、LiveData、ViewModel
一、Lifecycle
- 增加观察者以感知Activity或者Fragment的生命周期。
support library在26.1.0及之后,继承AppCompatActivity
//build.gradledependencies { ... implementation 'com.android.support:appcompat-v7:28.0.0' ...}//MainActivitypublic class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "zwm, onCreate"); getLifecycle().addObserver(new GenericLifecycleObserver() { @Override public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) { Log.d(TAG, "zwm, onStateChanged, event: " + event); } }); }}//输出log2019-11-14 14:05:44.137 2441-2441/com.tomorrow.architetest D/MainActivity: zwm, onCreate2019-11-14 14:05:44.141 2441-2441/com.tomorrow.architetest D/MainActivity: zwm, onStateChanged, event: ON_CREATE2019-11-14 14:05:44.178 2441-2441/com.tomorrow.architetest D/MainActivity: zwm, onStateChanged, event: ON_START2019-11-14 14:05:44.517 2441-2441/com.tomorrow.architetest D/MainActivity: zwm, onStateChanged, event: ON_RESUME2019-11-14 14:06:01.797 2441-2441/com.tomorrow.architetest D/MainActivity: zwm, onStateChanged, event: ON_PAUSE2019-11-14 14:06:01.859 2441-2441/com.tomorrow.architetest D/MainActivity: zwm, onStateChanged, event: ON_STOPsupport library在26.1.0及之后,继承Activity
//build.gradledependencies { ... implementation 'com.android.support:appcompat-v7:28.0.0' ...}//MainActivitypublic class MainActivity extends Activity implements LifecycleOwner { private static final String TAG = "MainActivity"; private LifecycleRegistry mLifecycleRegistry; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "zwm, onCreate"); mLifecycleRegistry = new LifecycleRegistry(this); mLifecycleRegistry.markState(Lifecycle.State.CREATED); getLifecycle().addObserver(new GenericLifecycleObserver() { @Override public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) { Log.d(TAG, "zwm, onStateChanged, event: " + event); } }); } @Override protected void onStart() { super.onStart(); mLifecycleRegistry.markState(Lifecycle.State.STARTED); } @NonNull @Override public Lifecycle getLifecycle() { return mLifecycleRegistry; }}//输出log2019-11-14 14:49:50.812 21432-21432/com.tomorrow.architetest D/MainActivity: zwm, onCreate2019-11-14 14:49:50.827 21432-21432/com.tomorrow.architetest D/MainActivity: zwm, onStateChanged, event: ON_CREATE2019-11-14 14:49:51.045 21432-21432/com.tomorrow.architetest D/MainActivity: zwm, onStateChanged, event: ON_START在MVP中使用
//build.gradledependencies { ... implementation 'com.android.support:appcompat-v7:28.0.0' implementation "android.arch.lifecycle:extensions:1.1.1" ...}//IPresenterpublic interface IPresenter extends LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) void onResume(); @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) void onPause();}//TestPresenterpublic class TestPresenter implements IPresenter { private static final String TAG = "TestPresenter"; @Override public void onResume() { Log.d(TAG, "zwm, onResume"); } @Override public void onPause() { Log.d(TAG, "zwm, onPause"); }}//MainActivitypublic class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private TestPresenter mPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "zwm, onCreate"); setContentView(R.layout.activity_main); mPresenter = new TestPresenter(); getLifecycle().addObserver(mPresenter); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "zwm, onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "zwm, onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "zwm, onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "zwm, onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "zwm, onDestroy"); }}//输出log2019-11-14 19:35:43.450 31119-31119/com.tomorrow.architetest D/MainActivity: zwm, onCreate2019-11-14 19:35:43.599 31119-31119/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-14 19:35:43.601 31119-31119/com.tomorrow.architetest D/MainActivity: zwm, onResume2019-11-14 19:35:43.601 31119-31119/com.tomorrow.architetest D/TestPresenter: zwm, onResume2019-11-14 19:35:47.408 31119-31119/com.tomorrow.architetest D/TestPresenter: zwm, onPause2019-11-14 19:35:47.409 31119-31119/com.tomorrow.architetest D/MainActivity: zwm, onPause2019-11-14 19:35:47.506 31119-31119/com.tomorrow.architetest D/MainActivity: zwm, onStop二、LiveData
- LiveData能感知Activity或者Fragment的生命周期。
- 当数据升级后,LiveData就会通知它的所有观察者,比方Activiy,但它只会通知处于Active状态的观察者,假如观察者处于Paused或者Destroyed状态,它将不会收到通知。
- 一旦观察者重新恢复Resumed状态,它将会重新收到LiveData的最新数据。
observe方法
//build.gradledependencies { ... implementation 'com.android.support:appcompat-v7:28.0.0' ...}//MainActivitypublic class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private TextView mTextView; private MutableLiveData<String> mNameEvent = new MutableLiveData<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "zwm, onCreate"); setContentView(R.layout.activity_main); mTextView = findViewById(R.id.textview); mNameEvent.observe(this, new Observer<String>() { @Override public void onChanged(@Nullable String s) { Log.i(TAG, "zwm, onChanged: str: " + s + ", thread: " + Thread.currentThread().getName()); mTextView.setText(s); } }); Log.d(TAG, "zwm, setValue, thread: " + Thread.currentThread().getName()); mNameEvent.setValue("setValue"); //只能在主线程调用,回调也是运行在主线程 new Handler().postDelayed(new Runnable() { @Override public void run() { new Thread(new Runnable() { @Override public void run() { Log.d(TAG, "zwm, postValue, thread: " + Thread.currentThread().getName()); mNameEvent.postValue("postValue"); //可以在后端线程调用,回调是运行在主线程 } }).start(); } }, 5000); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "zwm, onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "zwm, onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "zwm, onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "zwm, onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "zwm, onDestroy"); }}//输出log2019-11-14 16:43:54.372 11257-11257/com.tomorrow.architetest D/MainActivity: zwm, onCreate2019-11-14 16:43:54.514 11257-11257/com.tomorrow.architetest D/MainActivity: zwm, setValue, thread: main2019-11-14 16:43:54.831 11257-11257/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-14 16:43:54.831 11257-11257/com.tomorrow.architetest I/MainActivity: zwm, onChanged: str: setValue, thread: main2019-11-14 16:43:54.849 11257-11257/com.tomorrow.architetest D/MainActivity: zwm, onResume2019-11-14 16:43:56.462 11257-11257/com.tomorrow.architetest D/MainActivity: zwm, onPause2019-11-14 16:43:56.516 11257-11257/com.tomorrow.architetest D/MainActivity: zwm, onStop2019-11-14 16:43:59.520 11257-11587/com.tomorrow.architetest D/MainActivity: zwm, postValue, thread: Thread-82019-11-14 16:44:12.881 11257-11257/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-14 16:44:12.881 11257-11257/com.tomorrow.architetest I/MainActivity: zwm, onChanged: str: postValue, thread: main2019-11-14 16:44:12.884 11257-11257/com.tomorrow.architetest D/MainActivity: zwm, onResumeobserveForever方法
//build.gradledependencies { ... implementation 'com.android.support:appcompat-v7:28.0.0' ...}//MainActivitypublic class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private TextView mTextView; private MutableLiveData<String> mNameEvent = new MutableLiveData<>(); private Observer<String> mObserver = new Observer<String>() { @Override public void onChanged(@Nullable String s) { Log.i(TAG, "zwm, onChanged: str: " + s + ", thread: " + Thread.currentThread().getName()); mTextView.setText(s); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "zwm, onCreate"); setContentView(R.layout.activity_main); mTextView = findViewById(R.id.textview); mNameEvent.observeForever(mObserver); Log.d(TAG, "zwm, setValue, thread: " + Thread.currentThread().getName()); mNameEvent.setValue("setValue"); //只能在主线程调用,回调也是运行在主线程 new Handler().postDelayed(new Runnable() { @Override public void run() { new Thread(new Runnable() { @Override public void run() { Log.d(TAG, "zwm, postValue, thread: " + Thread.currentThread().getName()); mNameEvent.postValue("postValue"); //可以在后端线程调用,回调是运行在主线程 } }).start(); } }, 5000); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "zwm, onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "zwm, onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "zwm, onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "zwm, onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "zwm, onDestroy"); mNameEvent.removeObserver(mObserver); }}//输出log2019-11-14 19:50:48.780 32431-32431/com.tomorrow.architetest D/MainActivity: zwm, onCreate2019-11-14 19:50:49.105 32431-32431/com.tomorrow.architetest D/MainActivity: zwm, setValue, thread: main2019-11-14 19:50:49.106 32431-32431/com.tomorrow.architetest I/MainActivity: zwm, onChanged: str: setValue, thread: main2019-11-14 19:50:49.170 32431-32431/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-14 19:50:49.177 32431-32431/com.tomorrow.architetest D/MainActivity: zwm, onResume2019-11-14 19:50:49.622 32431-32431/com.tomorrow.architetest D/MainActivity: zwm, onPause2019-11-14 19:50:49.645 32431-32431/com.tomorrow.architetest D/MainActivity: zwm, onStop2019-11-14 19:50:54.111 32431-536/com.tomorrow.architetest D/MainActivity: zwm, postValue, thread: Thread-82019-11-14 19:50:54.112 32431-32431/com.tomorrow.architetest I/MainActivity: zwm, onChanged: str: postValue, thread: main更改LiveData中的数据
可以在LiveData对象分发给观察者之前对其中存储的值进行更改。
1.Transformations.map()
//build.gradledependencies { ... implementation 'com.android.support:appcompat-v7:28.0.0' ...}//MainActivitypublic class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private TextView mTextView; private MutableLiveData<String> mMutableLiveData = new MutableLiveData<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "zwm, onCreate"); setContentView(R.layout.activity_main); mTextView = findViewById(R.id.textview); mMutableLiveData.observe(this, new Observer<String>() { @Override public void onChanged(@Nullable String s) { Log.i(TAG, "zwm, mMutableLiveData onChanged, str: " + s + ", thread: " + Thread.currentThread().getName()); } }); LiveData transformedLiveData = Transformations.map(mMutableLiveData, new Function<String, String>() { @Override public String apply(@Nullable String input) { Log.i(TAG, "zwm, transformedLiveData apply, str: " + input + ", thread: " + Thread.currentThread().getName()); String output = input + " transformed"; return output; } }); transformedLiveData.observe(this, new Observer<String>() { @Override public void onChanged(@Nullable String s) { Log.i(TAG, "zwm, transformedLiveData onChanged, str: " + s + ", thread: " + Thread.currentThread().getName()); mTextView.setText(s); } }); Log.d(TAG, "zwm, setValue, thread: " + Thread.currentThread().getName()); mMutableLiveData.setValue("setValue"); //只能在主线程调用,回调也是运行在主线程 new Handler().postDelayed(new Runnable() { @Override public void run() { new Thread(new Runnable() { @Override public void run() { Log.d(TAG, "zwm, postValue, thread: " + Thread.currentThread().getName()); mMutableLiveData.postValue("postValue"); //可以在后端线程调用,回调是运行在主线程 } }).start(); } }, 5000); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "zwm, onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "zwm, onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "zwm, onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "zwm, onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "zwm, onDestroy"); }}//输出log2019-11-14 17:06:09.766 15245-15245/com.tomorrow.architetest D/MainActivity: zwm, onCreate2019-11-14 17:06:09.885 15245-15245/com.tomorrow.architetest D/MainActivity: zwm, setValue, thread: main2019-11-14 17:06:09.892 15245-15245/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-14 17:06:09.893 15245-15245/com.tomorrow.architetest I/MainActivity: zwm, mMutableLiveData onChanged, str: setValue, thread: main2019-11-14 17:06:09.893 15245-15245/com.tomorrow.architetest I/MainActivity: zwm, transformedLiveData apply, str: setValue, thread: main2019-11-14 17:06:09.893 15245-15245/com.tomorrow.architetest I/MainActivity: zwm, transformedLiveData onChanged, str: setValue transformed, thread: main2019-11-14 17:06:09.895 15245-15245/com.tomorrow.architetest D/MainActivity: zwm, onResume2019-11-14 17:06:14.894 15245-15268/com.tomorrow.architetest D/MainActivity: zwm, postValue, thread: Thread-82019-11-14 17:06:14.895 15245-15245/com.tomorrow.architetest I/MainActivity: zwm, mMutableLiveData onChanged, str: postValue, thread: main2019-11-14 17:06:14.895 15245-15245/com.tomorrow.architetest I/MainActivity: zwm, transformedLiveData apply, str: postValue, thread: main2019-11-14 17:06:14.895 15245-15245/com.tomorrow.architetest I/MainActivity: zwm, transformedLiveData onChanged, str: postValue transformed, thread: main2.Transformations.switchMap()
//build.gradledependencies { ... implementation 'com.android.support:appcompat-v7:28.0.0' ...}//MainActivitypublic class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private TextView mTextView; MutableLiveData<String> mMutableLiveData1 = new MutableLiveData<>(); MutableLiveData<String> mMutableLiveData2 = new MutableLiveData<>(); MutableLiveData<Boolean> mLiveDataSwitch = new MutableLiveData<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "zwm, onCreate"); setContentView(R.layout.activity_main); mTextView = findViewById(R.id.textview); LiveData transformedLiveData = Transformations.switchMap(mLiveDataSwitch, new Function<Boolean, LiveData<String>>() { @Override public LiveData<String> apply(Boolean input) { Log.d(TAG, "zwm, transformedLiveData apply, input: " + input + ", thread: " + Thread.currentThread().getName()); if (input) { return mMutableLiveData1; } else { return mMutableLiveData2; } } }); transformedLiveData.observe(this, new Observer<String>() { @Override public void onChanged(@Nullable final String s) { Log.d(TAG, "zwm, transformedLiveData onChanged, str: " + s + ", thread: " + Thread.currentThread().getName()); mTextView.setText(s); } }); mLiveDataSwitch.postValue(false); new Handler().postDelayed(new Runnable() { @Override public void run() { Log.d(TAG, "zwm, transformedLiveData postValue, thread: " + Thread.currentThread().getName()); mMutableLiveData1.postValue("mMutableLiveData1"); mMutableLiveData2.postValue("mMutableLiveData2"); } }, 3000); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "zwm, onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "zwm, onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "zwm, onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "zwm, onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "zwm, onDestroy"); }}//输出log2019-11-14 18:22:05.639 20949-20949/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-14 18:22:05.667 20949-20949/com.tomorrow.architetest D/MainActivity: zwm, onResume2019-11-14 18:22:12.696 21755-21755/com.tomorrow.architetest D/MainActivity: zwm, onCreate2019-11-14 18:22:12.824 21755-21755/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-14 18:22:12.827 21755-21755/com.tomorrow.architetest D/MainActivity: zwm, onResume2019-11-14 18:22:12.857 21755-21755/com.tomorrow.architetest D/MainActivity: zwm, transformedLiveData apply, input: false, thread: main2019-11-14 18:22:15.822 21755-21755/com.tomorrow.architetest D/MainActivity: zwm, transformedLiveData postValue, thread: main2019-11-14 18:22:15.824 21755-21755/com.tomorrow.architetest D/MainActivity: zwm, transformedLiveData onChanged, str: mMutableLiveData2, thread: main2019-11-14 18:22:31.822 21755-21755/com.tomorrow.architetest D/MainActivity: zwm, onPause2019-11-14 18:22:31.898 21755-21755/com.tomorrow.architetest D/MainActivity: zwm, onStop合并多个LiveData数据源
//build.gradledependencies { ... implementation 'com.android.support:appcompat-v7:28.0.0' ...}//MainActivitypublic class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private TextView mTextView; MutableLiveData<String> mMutableLiveData1 = new MutableLiveData<>(); MutableLiveData<String> mMutableLiveData2 = new MutableLiveData<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "zwm, onCreate"); setContentView(R.layout.activity_main); mTextView = findViewById(R.id.textview); MediatorLiveData liveDataMerger = new MediatorLiveData<String>(); liveDataMerger.addSource(mMutableLiveData1, new Observer<String>() { @Override public void onChanged(@Nullable String s) { Log.d(TAG, "zwm, mMutableLiveData1 onChanged, str: "+ s + ", thread: " + Thread.currentThread().getName()); } }); liveDataMerger.addSource(mMutableLiveData2, new Observer<String>() { @Override public void onChanged(@Nullable String s) { Log.d(TAG, "zwm, mMutableLiveData2 onChanged, str: "+ s + ", thread: " + Thread.currentThread().getName()); } }); liveDataMerger.observe(this, new Observer<String>() { @Override public void onChanged(@Nullable String s) { Log.d(TAG, "zwm, liveDataMerger onChanged, str: "+ s + ", thread: " + Thread.currentThread().getName()); } }); mMutableLiveData2.postValue("mMutableLiveData2"); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "zwm, onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "zwm, onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "zwm, onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "zwm, onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "zwm, onDestroy"); }}//输出log2019-11-14 18:41:50.351 27541-27541/com.tomorrow.architetest D/MainActivity: zwm, onCreate2019-11-14 18:41:50.525 27541-27541/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-14 18:41:50.528 27541-27541/com.tomorrow.architetest D/MainActivity: zwm, onResume2019-11-14 18:41:50.567 27541-27541/com.tomorrow.architetest D/MainActivity: zwm, mMutableLiveData2 onChanged, str: mMutableLiveData2, thread: main2019-11-14 18:41:57.894 27541-27541/com.tomorrow.architetest D/MainActivity: zwm, onPause2019-11-14 18:41:58.001 27541-27541/com.tomorrow.architetest D/MainActivity: zwm, onStop三、ViewModel
以感知生命周期的形式来存储和管理视图相关的数据。
- Activity或者Fragment主要用于显示视图数据,也叫视图控制器,假如它们也需要负责数据库或者者网络访问等操作,就会变得臃肿、难以维护。而ViewModel可以有效将视图数据相关逻辑和视图控制器分离开来。
- 当Activity被销毁时可以使用onSaveInstanceState方法保存数据,但是该方法仅适用于保存一些支持序列化、反序列化的数据,不适用于大量数据(例如客户列表或者位图)。而ViewModel不仅支持保存大量数据,并且不需要序列化、反序列化操作。
视图控制器有时需要较长时间才能返回的异步调用,视图控制器需要管理这些调用,在合适的时候清除它们,以确保它们的生命周期不会大于自身,避免内存泄漏。而ViewModel恰恰可以避免内存泄漏的发生。
ViewModel的生命周期
//build.gradledependencies { ... implementation 'com.android.support:appcompat-v7:28.0.0' implementation "android.arch.lifecycle:extensions:1.1.1" ...}//TestViewModelpublic class TestViewModel extends ViewModel { //ViewModel private static final String TAG = "TestViewModel"; private MutableLiveData<String> mNameLiveData; //LiveData public LiveData<String> getNameLiveData() { Log.d(TAG, "zwm, getNameLiveData mNameLiveData: " + mNameLiveData); if (mNameLiveData == null) { mNameLiveData = new MutableLiveData<>(); mNameLiveData.setValue("初始值"); } return mNameLiveData; } public void getName() { Log.d(TAG, "zwm, getName"); new Handler().postDelayed(new Runnable() { @Override public void run() { Log.d(TAG, "zwm, getName result"); mNameLiveData.setValue("升级值"); } }, 5000); }}//MainActivitypublic class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "zwm, onCreate"); setContentView(R.layout.activity_main); mTextView = findViewById(R.id.textview); TestViewModel viewModel = ViewModelProviders.of(this).get(TestViewModel.class); Log.d(TAG, "zwm, this: " + this + ", viewModel: " + viewModel); viewModel.getNameLiveData().observe(this, new Observer<String>() { @Override public void onChanged(@Nullable String s) { Log.d(TAG, "zwm, onChanged:" + s + ", thread: " + Thread.currentThread().getName()); } }); viewModel.getName(); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "zwm, onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "zwm, onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "zwm, onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "zwm, onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "zwm, onDestroy"); }}//输出log2019-11-14 20:38:13.246 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onCreate2019-11-14 20:38:13.289 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, this: com.tomorrow.architetest.MainActivity@e7194e9, viewModel: com.tomorrow.architetest.TestViewModel@44054cc2019-11-14 20:38:13.289 7299-7299/com.tomorrow.architetest D/TestViewModel: zwm, getNameLiveData mNameLiveData: null2019-11-14 20:38:13.289 7299-7299/com.tomorrow.architetest D/TestViewModel: zwm, getName2019-11-14 20:38:13.295 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-14 20:38:13.296 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onChanged:初始值, thread: main2019-11-14 20:38:13.298 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onResume2019-11-14 20:38:15.565 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onPause2019-11-14 20:38:15.664 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onStop2019-11-14 20:38:18.290 7299-7299/com.tomorrow.architetest D/TestViewModel: zwm, getName result2019-11-14 20:38:26.805 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-14 20:38:26.806 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onChanged:升级值, thread: main2019-11-14 20:38:26.821 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onResume2019-11-14 20:38:32.878 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onPause2019-11-14 20:38:32.879 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onStop2019-11-14 20:38:32.881 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onDestroy2019-11-14 20:38:32.975 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onCreate2019-11-14 20:38:33.017 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, this: com.tomorrow.architetest.MainActivity@3284e32, viewModel: com.tomorrow.architetest.TestViewModel@44054cc2019-11-14 20:38:33.017 7299-7299/com.tomorrow.architetest D/TestViewModel: zwm, getNameLiveData mNameLiveData: android.arch.lifecycle.MutableLiveData@3bad2a92019-11-14 20:38:33.018 7299-7299/com.tomorrow.architetest D/TestViewModel: zwm, getName2019-11-14 20:38:33.023 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-14 20:38:33.023 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onChanged:升级值, thread: main2019-11-14 20:38:33.026 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onResume2019-11-14 20:38:38.023 7299-7299/com.tomorrow.architetest D/TestViewModel: zwm, getName result2019-11-14 20:38:38.024 7299-7299/com.tomorrow.architetest D/MainActivity: zwm, onChanged:升级值, thread: main四、Demo
MVP + Lifecycle + LiveData + ViewModel
//build.gradledependencies { ... implementation 'com.android.support:appcompat-v7:28.0.0' implementation "android.arch.lifecycle:extensions:1.1.1" ...}//MainActivitypublic class MainActivity extends AppCompatActivity { //MVP: View private static final String TAG = "MainActivity"; private TestViewModel mTestViewModel; private TestPresenter mTestPresenter; private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "zwm, onCreate, savedInstanceState: " + savedInstanceState); setContentView(R.layout.activity_main); mTextView = findViewById(R.id.textview); mTestViewModel = ViewModelProviders.of(this).get(TestViewModel.class); //MVP: ViewModel mTestPresenter = new TestPresenter(this, mTestViewModel); //MVP: Presenter getLifecycle().addObserver(mTestPresenter); //Lifecycle Log.d(TAG, "zwm, this: " + this + ", mTestViewModel: " + mTestViewModel + ", mTestPresenter: " + mTestPresenter); if(savedInstanceState == null) { lazyInit(); } } @Override protected void onStart() { super.onStart(); Log.d(TAG, "zwm, onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "zwm, onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "zwm, onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "zwm, onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "zwm, onDestroy"); } private void lazyInit() { Log.d(TAG, "zwm, lazyInit"); getWindow().getDecorView().post(new Runnable() { @Override public void run() { Log.d(TAG, "zwm, lazyInit start"); if(mTestPresenter != null) { mTestPresenter.getName(); } } }); } public void updateName(String name) { Log.d(TAG, "zwm, updateName name: " + name); if(mTextView != null) { mTextView.setText(name); } }}//IPresenterpublic interface IPresenter extends LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) void onCreate(); @OnLifecycleEvent(Lifecycle.Event.ON_START) void onStart(); @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) void onResume(); @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) void onPause(); @OnLifecycleEvent(Lifecycle.Event.ON_STOP) void onStop(); @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) void onDestroy();}//TestPresenterpublic class TestPresenter implements IPresenter { //MVP: Presenter private static final String TAG = "TestPresenter"; private MainActivity mActivity; //MVP: View private TestViewModel mViewModel; //MVP: ViewModel public TestPresenter(MainActivity activity, TestViewModel viewModel) { Log.d(TAG, "zwm, new TestPresenter"); mActivity = activity; mViewModel = viewModel; } @Override public void onCreate() { Log.d(TAG, "zwm, onCreate"); observeNameLiveData(); } @Override public void onStart() { Log.d(TAG, "zwm, onStart"); } @Override public void onResume() { Log.d(TAG, "zwm, onResume"); } @Override public void onPause() { Log.d(TAG, "zwm, onPause"); } @Override public void onStop() { Log.d(TAG, "zwm, onStop"); } @Override public void onDestroy() { Log.d(TAG, "zwm, onDestroy"); } private void observeNameLiveData() { Log.d(TAG, "zwm, observeNameLiveData"); if(mViewModel != null) { mViewModel.getNameLiveData().observe(mActivity, new Observer<String>() { @Override public void onChanged(@Nullable String s) { Log.d(TAG, "zwm, observeNameLiveData onChanged, str: " + s); if(mActivity != null) { mActivity.updateName(s); } } }); } } public void getName() { Log.d(TAG, "zwm, getName"); if(mViewModel != null) { mViewModel.getName(); } }}//TestViewModelpublic class TestViewModel extends ViewModel { //MVP: ViewModel private static final String TAG = "TestViewModel"; private MutableLiveData<String> mNameLiveData; //LiveData public LiveData<String> getNameLiveData() { Log.d(TAG, "zwm, getNameLiveData mNameLiveData: " + mNameLiveData); if (mNameLiveData == null) { mNameLiveData = new MutableLiveData<>(); mNameLiveData.setValue("初始值"); } return mNameLiveData; } public void getName() { Log.d(TAG, "zwm, getName"); new Handler().postDelayed(new Runnable() { @Override public void run() { Log.d(TAG, "zwm, getName result"); mNameLiveData.setValue("升级值"); } }, 5000); }}//输出log2019-11-15 10:23:50.099 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, onCreate, savedInstanceState: null2019-11-15 10:23:50.253 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, new TestPresenter2019-11-15 10:23:50.259 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, this: com.tomorrow.architetest.MainActivity@9f56687, mTestViewModel: com.tomorrow.architetest.TestViewModel@94258b2, mTestPresenter: com.tomorrow.architetest.TestPresenter@fb20abd2019-11-15 10:23:50.259 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, lazyInit2019-11-15 10:23:50.261 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, onCreate2019-11-15 10:23:50.261 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, observeNameLiveData2019-11-15 10:23:50.261 25606-25606/com.tomorrow.architetest D/TestViewModel: zwm, getNameLiveData mNameLiveData: null2019-11-15 10:23:50.613 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-15 10:23:50.613 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, onStart2019-11-15 10:23:50.613 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, observeNameLiveData onChanged, str: 初始值2019-11-15 10:23:50.613 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, updateName name: 初始值2019-11-15 10:23:50.693 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, onResume2019-11-15 10:23:50.693 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, onResume2019-11-15 10:23:51.134 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, lazyInit start2019-11-15 10:23:51.134 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, getName2019-11-15 10:23:51.134 25606-25606/com.tomorrow.architetest D/TestViewModel: zwm, getName2019-11-15 10:23:53.489 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, onPause2019-11-15 10:23:53.489 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, onPause2019-11-15 10:23:53.770 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, onStop2019-11-15 10:23:53.771 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, onStop2019-11-15 10:23:56.135 25606-25606/com.tomorrow.architetest D/TestViewModel: zwm, getName result2019-11-15 10:24:11.128 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-15 10:24:11.128 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, onStart2019-11-15 10:24:11.128 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, observeNameLiveData onChanged, str: 升级值2019-11-15 10:24:11.129 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, updateName name: 升级值2019-11-15 10:24:11.131 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, onResume2019-11-15 10:24:11.131 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, onResume2019-11-15 10:24:15.603 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, onPause2019-11-15 10:24:15.603 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, onPause2019-11-15 10:24:15.604 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, onStop2019-11-15 10:24:15.604 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, onStop2019-11-15 10:24:15.606 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, onDestroy2019-11-15 10:24:15.606 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, onDestroy2019-11-15 10:24:15.703 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, onCreate, savedInstanceState: Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@a326b10, 2131165190=android.support.v7.widget.Toolbar$SavedState@276a609, 2131165192=android.view.AbsSavedState$1@a326b10, 2131165198=android.view.AbsSavedState$1@a326b10, 2131165232=android.view.AbsSavedState$1@a326b10, 2131165319=android.view.AbsSavedState$1@a326b10}}], android:lastAutofillId=1073741823, android:fragments=android.app.FragmentManagerState@711a00e}]2019-11-15 10:24:15.748 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, new TestPresenter2019-11-15 10:24:15.748 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, this: com.tomorrow.architetest.MainActivity@93393d3, mTestViewModel: com.tomorrow.architetest.TestViewModel@94258b2, mTestPresenter: com.tomorrow.architetest.TestPresenter@4ee7e352019-11-15 10:24:15.748 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, onCreate2019-11-15 10:24:15.749 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, observeNameLiveData2019-11-15 10:24:15.749 25606-25606/com.tomorrow.architetest D/TestViewModel: zwm, getNameLiveData mNameLiveData: android.arch.lifecycle.MutableLiveData@923bc3b2019-11-15 10:24:15.770 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, onStart2019-11-15 10:24:15.771 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, onStart2019-11-15 10:24:15.771 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, observeNameLiveData onChanged, str: 升级值2019-11-15 10:24:15.771 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, updateName name: 升级值2019-11-15 10:24:15.775 25606-25606/com.tomorrow.architetest D/MainActivity: zwm, onResume2019-11-15 10:24:15.775 25606-25606/com.tomorrow.architetest D/TestPresenter: zwm, onResumeAndroid应用架构
Android应用架构
相关链接
Android Jetpack架构组件系列
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 架构组件 — Lifecycle、LiveData、ViewModel
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 架构组件 — Lifecycle、LiveData、ViewModel