LifecycleObserver没有起作用。

10

观察者方法没有被调用。我按照传统的方式测试了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"

你能发布你的活动吗? - azizbekian
@azizbekian 完成了。感谢您的帮助。 - Emre Aktürk
我有同样的问题,但任何答案都不起作用。 - Mahdi
5个回答

5
似乎仅实现 LifecycleRegistryOwner 是不够的。
我在 1.0.0-alpha1 中遇到了同样的问题,事实上我需要自己将生命周期事件转发到 Lifecycle 实例中才能使其正常工作。这是因为文档与实现不一致,或者这是库中的一个 bug。
我只在我的 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)
    }
}

2
这个问题正在此问题中被跟踪。 - CommonsWare

4

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

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

通过实现内置的 LifecycleRegistryOwner 接口(而不是扩展 LifecycleFragmentLifecycleActivity),任何自定义的片段或活动都可以变成 LifecycleOwner


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

如果您想将自定义类变成 LifecycleOwner,可以使用 LifecycleRegistry 类,但是您需要将事件转发到该类中。如果它们实现了 LifecycleRegistryOwner 接口,则片段和活动会自动完成此转发。


实际上我正在使用自定义活动,参考:在自定义活动和片段中实现LifecycleOwner(https://developer.android.com/topic/libraries/architecture/lifecycle.html) - Emre Aktürk
是的,但您尚未正确应用文档中指定的建议。 - azizbekian
我同意这里的观点,@EmreAktürk你应该实现LifecycleRegistryOwner,否则你必须自己将生命周期事件转发给你的观察者。 - romtsn
哦,我没注意到我实现了错误的接口。因此没有异常。我将在一个小时内测试后接受答案。 :) - Emre Aktürk
我准确实现了LifecycleOwner Activity,但任何生命周期事件都没有触发。 - Mahdi
2018年12月,LifecycleRegistryOwner似乎已被弃用。 - Willa

3

从Support Library 26.1.0开始,如果你的Activity/Fragment继承自其类,你就可以免费获取生命周期回调。

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

https://developer.android.com/topic/libraries/architecture/lifecycle#lc

lifecycle.addObserver(object : DefaultLifecycleObserver {
    override fun onDestroy(owner: LifecycleOwner) {
        Log.d("AppLog", "onDestroy")
    }

Android Studio中的Bumblebee说:“'OnLifecycleEvent'已过时。 在Java中已过时。” - rwst
@rwst 更新了答案,提供了新的、非废弃的解决方案。 - android developer

3
问题在于您正在扩展平台默认的Activity类,而不是支持库的FragmentActivity
这是一位Google工程师在这个错误报告中所述:
“是的,我们目前没有针对平台Activity/Fragment。我会保持这个开放状态,但我们不打算在最近的未来解决这个问题。”
“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


然而,我正在使用扩展FragmentActivityAppCompatActivity,但它仍然无法工作。 - rwst

0

生命周期.观察者(new 观察者);

转换为

getLifecycle().Observer(new 观察者);

百分之百有效


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接