架构组件 — Lifecycle、LiveData、ViewModel

作者 : 开心源码 本文共30975个字,预计阅读时间需要78分钟 发布时间: 2022-05-13 共214人阅读

一、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_STOP

support 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, onResume

observeForever方法

//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: main

2.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, onResume

Android应用架构

Android应用架构

相关链接

Android Jetpack架构组件系列

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 架构组件 — Lifecycle、LiveData、ViewModel

发表回复