web-dev-qa-db-ja.com

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();
    }
}

活動は要約されています。 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"
6
Emre Aktürk

通常のActivityを拡張する代わりに、LifecycleActivityから拡張する必要があります。

それ以外の場合は、 "カスタムアクティビティとフラグメントでのLifecycleOwnerの実装" :を参照できます。

組み込みの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インターフェイスを実装している場合、それらに対して自動的に実行されます。

3
azizbekian

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)
    }
}
_
5

問題は、サポートライブラリのActivityではなくプラットフォームのデフォルトのFragmentActivityクラスを拡張していることです。

これは、Googleのエンジニアがこれで述べていることです バグレポート

ええ、現在、プラットフォームのアクティビティ/フラグメントは対象外です。

私はこれを開いたままにしていますが、近い将来これを修正する予定はありません。

プラットフォームフラグメントを使用する人のための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

2
Samuel Peter

サポートライブラリ26.1.0以降、アクティビティ/フラグメントがそのクラスから拡張されている場合、ライフサイクルコールバックを無料で取得できます。

これが、次のようなことができる理由です。

Java:

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

Kotlin:

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

ドキュメントで詳細を読む:

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

2