Naz*_*kiy 4 java android mvvm android-lifecycle android-livedata
我已经阅读了有关Android中新的架构组件的信息。因此,我想问什么是生命周期观察者,为什么我们需要它们?在什么情况下有用?感谢您的回答!
ole*_*234 22
@OnLifecycleEvent已被弃用,因此许多曾经在这里有用的答案不再有帮助。如果您当前尚未使用 Java 8,则需要build.gradle先更新。我们现在可以利用DefaultLifecycleObserveror LifecycleEventObserver。请参阅下面的示例。
首先,您可以使用以下方法ProcessLifecycleOwner获取应用程序的生命周期:
ProcessLifecycleOwner.get().getLifecycle()
Run Code Online (Sandbox Code Playgroud)
DefaultLifecycleObserver:
lifecycle.addObserver(object: DefaultLifecycleObserver {
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
TODO()
}
override fun onPause(owner: LifecycleOwner) {
TODO()
super.onPause(owner)
}
})
Run Code Online (Sandbox Code Playgroud)
LifecycleEventObserver:
lifecycle.addObserver(object: LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_RESUME -> TODO()
Lifecycle.Event.ON_PAUSE -> TODO()
else -> { }
}
}
})
Run Code Online (Sandbox Code Playgroud)
如何更新到 Java 8 以及OnLifecycleEvent不推荐使用原因的解释:/sf/answers/4926895501/
您可以将ProcessLifecycleOwner用于应用程序生命周期事件。您可以在应用程序类中实现Lifecycler Observer
public class MyApplication extends MultiDexApplication implements LifecycleObserver
@Override
public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}
Run Code Online (Sandbox Code Playgroud)
//添加生命周期方法以查看应用程序背景和前景事件
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void appInResumeState() {
Toast.makeText(this,"In Foreground",Toast.LENGTH_LONG).show();
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void appInPauseState() {
Toast.makeText(this,"In Background",Toast.LENGTH_LONG).show();
}
Run Code Online (Sandbox Code Playgroud)
//添加build.gradle文件
implementation 'android.arch.lifecycle:extensions:1.1.1'
Run Code Online (Sandbox Code Playgroud)
//也在活动或片段中
使用还可以通过创建实现生命周期观察器的不同组件,然后将活动的生命周期传递给这些组件,来降低代码的复杂性。这样,您可以将巨大的复杂性拆分为不同的组件。
class MainActivity : AppCompatActivity() ,LifecycleObserver{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ReduceComplexComponent().registerLifecycle(lifecycle)
}
Run Code Online (Sandbox Code Playgroud)
}
class ReduceComplexComponent : LifecycleObserver{
registerLifecycle(lifecycle : Lifecycle){
lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun resume() {
Log.d("OnResume","ON_RESUME")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun pause() {
Log.d("onPause","ON_PAUSE")
}
}
Run Code Online (Sandbox Code Playgroud)
这样,您可以在单独的组件中监听活动或片段生命周期事件。
我们还可以在Activity中手动获取生命周期实例的当前状态,并可以使用其getCurrentState()进行操作
State还具有isAtLeast()方法,可用于与当前生命周期状态进行比较
可能有点晚了,但生命周期的另一个很好的用例(除了明显的 ViewModel 东西)是让应用程序的许多组件在相关活动被破坏时自行取消注册,或者干脆退出屏幕。
\n\n例如,我有一个创建对话框的静态工厂,并且使用生命周期我可以关闭这些对话框,而不会用诸如和之类的旧内容扰乱主机活动Dialog mDialog = ...void onPause(){ ... if (mDialog !null && mDialog.isShowing()) mDialog.cancel() }
一些代码:
\n\npublic static void showConfirmDialog(Lifecycle lifecycle, String title, String msg, Runnable okRunnable) {\n AlertDialog dialog = AlertDialog.Builder(mAppContext)\n /* configuration stuff ... */\n .build();\n\n dialog.show();\n\n lifecycle.addObserver(new LifecycleObserver() {\n @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)\n public void cancelDialog() {\n if (dialog.isShowing()) { // if not already dismissed by main-button tap \n dialog.cancel();\n }\n }\n });\n}\nRun Code Online (Sandbox Code Playgroud)\n\npublic class MyActivity extends AppCompatActivity {\n\n /* stuff... onCreate()... other stuff... */\n\n private void confirmDeleteUser(User user){\n DialogUtils.showConfirmDialog(\n MyActivity.this.getLifecycle(), // all activities & fragment have lifecycles\n "Confirm Delete",\n "Action cannot be undone. Sure to continue?",\n new Runnable() { /* stuff... */ }\n );\n // Voil\xc3\xa0! \n // activity no needs to store reference to the dialog and cancel manually on pause\n // it\'s a fire-and-forget action\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
3566 次 |
| 最近记录: |