LifecycleObserver无法正常工作

时间:2017-06-06 06:52:04

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

未调用Observer方法。我用旧学校的方式测试了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 s。

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"

4 个答案:

答案 0 :(得分:5)

似乎实施LifecycleRegistryOwner还不够。

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

我在onStart()中仅使用了onStop()Observers,因此我将这些生命周期事件转发给了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)
    }
}

答案 1 :(得分:2)

您应该从Activity延伸,而不是扩展普通LifecycleActivity

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

  

通过实施内置的 LifecycleRegistryOwner 界面,可以将任何自定义片段或活动转换为 LifecycleOwner (而不是扩展 LifecycleFragment 或<强> LifecycleActivity )。


    public class MyFragment extends Fragment implements LifecycleRegistryOwner {
        LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

        @Override
        public LifecycleRegistry getLifecycle() {
            return lifecycleRegistry;
        }
    }

  

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

答案 2 :(得分:1)

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

这是Google工程师在此bug report中所述的内容:

  

是的,我们目前没有针对平台活动/碎片。

     

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

     

使用平台碎片的人的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

答案 3 :(得分:1)

从Support Library 26.1.0开始,如果您的Activity / Fragment从其类扩展,则可以免费获得生命周期回调。

这就是为什么你可以这样做的原因:

爪哇:

    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