LifecycleObserver不起作用

观察者方法没有被调用。 我测试ViewPagerCycler在旧的方式和工作完美。 感谢帮助。

 public final class ViewPagerCycler implements LifecycleObserver { private static final int PERIOD = 3000; private Timer mTimer; private TimerTask mTask; private Activity mActivity; private ViewPager mPager; public ViewPagerCycler(Activity activity, ViewPager pager) { mActivity = activity; mPager = pager; } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void start() { int count = mPager .getAdapter() .getCount(); mTimer = new Timer(); mTask = new TimerTask() { @Override public void run() { mActivity.runOnUiThread(new TimerTask() { @Override public void run() { mPager.setCurrentItem((mPager.getCurrentItem() + 1) % count, true); } }); } }; mTimer.schedule(mTask, PERIOD, PERIOD); } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) public void stop() { mTask.cancel(); mTimer.cancel(); mTimer.purge(); } } 

活动只是总结。 我没有添加findViewById

 public class SummariziedActivity extends Activity implements LifecycleOwner { private final LifecycleRegistry mRegistry = new LifecycleRegistry(this); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mRegistry.addObserver(new ViewPagerCycler(mPager)); } } 

build.gradle

 compile "android.arch.lifecycle:runtime:1.0.0-alpha2" compile "android.arch.lifecycle:extensions:1.0.0-alpha2" annotationProcessor "android.arch.lifecycle:compiler:1.0.0-alpha2" 

您应该扩展LifecycleActivity ,而不是扩展普通的Activity

否则,您可以参考“在自定义活动和片段中实现LifecycleOwner” :

通过实现内置的LifecycleRegistryOwner接口(而不是扩展LifecycleFragmentLifecycleActivity ),可以将任何定制片段或活动转换为LifecycleOwner

public class MyFragment extends Fragment implements LifecycleRegistryOwner { LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this); @Override public LifecycleRegistry getLifecycle() { return lifecycleRegistry; } }
public class MyFragment extends Fragment implements LifecycleRegistryOwner { LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this); @Override public LifecycleRegistry getLifecycle() { return lifecycleRegistry; } } 

如果您有一个自定义类,您希望创建一个LifecycleOwner ,则可以使用LifecycleRegistry类,但是您需要将事件转发到该类。 如果这些转发实现了LifecycleRegistryOwner接口,则该转发将自动完成。

看起来像实施LifecycleRegistryOwner是不够的。

我在1.0.0-alpha1遇到了同样的问题,我实际上需要自己将生命周期事件转发到Lifecycle实例,以使其工作。 这是因为文档不符合实现,或者这是库中的一个错误。

我只在我的Observers使用onStart()onStop() ,所以我将这些生命周期事件转发到Lifecycle

 abstract class LifecyclePreferenceFragment : PreferenceFragment(), LifecycleRegistryOwner { private val mLifecycleRegistry = LifecycleRegistry(this) override fun getLifecycle() = mLifecycleRegistry override fun onStart() { super.onStart() lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START) } override fun onStop() { super.onStop() lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP) } } 

问题是你正在扩展平台默认的Activity类而不是支持库的FragmentActivity

这是Google的工程师在这个错误报告中说的 :

是的,我们目前没有针对平台的Activity / Fragments。

我保持这个开放,但我们不打算在最近的将来解决这个问题。

PS使用平台片段的人:请考虑使用支持库片段。 当您使用平台片段时,这意味着您的代码依赖于设备随附的片段的多年执行。 这些实现通常很旧,并且有很多已经在支持库中修复的错误。

您可以在生命周期实现中看到仅为FragmentActivity启用生命周期跟踪,例如在以下LifecycleDispatcher.java摘录中:

  @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { if (activity instanceof FragmentActivity) { ((FragmentActivity) activity).getSupportFragmentManager() .registerFragmentLifecycleCallbacks(mFragmentCallback, true); } ReportFragment.injectIfNeededIn(activity); } @Override public void onActivityStopped(Activity activity) { if (activity instanceof FragmentActivity) { markState((FragmentActivity) activity, CREATED); } } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { if (activity instanceof FragmentActivity) { markState((FragmentActivity) activity, CREATED); } } 

有关如何实现生命周期事件调度的更多信息,请参阅我的其他答案: https : //stackoverflow.com/a/45701439/2510655

从支持库26.1.0开始,如果您的活动/片段从其类扩展,您可以免费获得生命周期回调。

这就是为什么你可以做这样的事情:

Java的:

  getLifecycle().addObserver(new LifecycleObserver() { @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) void onDestroy() { Log.d("AppLog", "onDestroy"); } }); 

科特林:

  lifecycle.addObserver(object : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun onDestroy() { Log.d("AppLog", "onDestroy") } }) 

阅读更多关于文档:

https://developer.android.com/topic/libraries/architecture/lifecycle.html