【问题标题】:LifecycleObserver is not workingLifecycleObserver 不工作
【发布时间】:2022-04-03 00:57:51
【问题描述】:

没有调用观察者方法。我以老式的方式测试了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();
    }
}

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

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 完成。感谢您的帮助
  • 我有同样的问题,但任何答案都不起作用。

标签: android android-lifecycle android-architecture-components


【解决方案1】:

似乎实现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)
    }
}

【讨论】:

【解决方案2】:

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

否则可以参考"Implementing LifecycleOwner in custom activities and fragments"

通过实现内置的LifecycleRegistryOwner接口(而不是扩展LifecycleFragment或LifecycleActivity)。

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

如果您有一个想要创建 LifecycleOwner 的自定义类,您可以使用 LifecycleRegistry 类,但您需要将事件转发到该类。如果 Fragment 和 Activity 实现了 LifecycleRegistryOwner 接口,则此转发会自动完成。

【讨论】:

  • 其实我用的是自定义Activity,参考:在自定义Activity和Fragment中实现LifecycleOwner(developer.android.com/topic/libraries/architecture/…)
  • 是的,但是您没有正确应用指定的建议in docs
  • 我同意这里,@EmreAktürk 你应该实现LifecycleRegistryOwner,否则你必须自己将生命周期事件转发给你的观察者。
  • 哦,没注意到我刚刚实现了错误的接口。因此也不例外。我会在一小时内测试后接受答案。 :)
  • 我完全实现了 LifecycleOwner Activity 但任何生命周期事件都不会触发。
【解决方案3】:

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

这是一位 Google 工程师在 bug report 中所说的:

是的,我们目前不针对平台 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

【讨论】:

  • 但是,我使用的是扩展FragmentActivityAppCompatActivity,但它仍然不起作用。
【解决方案4】:

从支持库 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 用新的、非弃用的解决方案更新了答案
猜你喜欢
  • 2023-01-14
  • 1970-01-01
  • 2018-12-19
  • 2020-08-02
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
相关资源
最近更新 更多