オブザーバーメソッドが呼び出されていません。私は昔ながらの方法で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"
通常の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インターフェイスを実装している場合、それらに対して自動的に実行されます。
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のエンジニアがこれで述べていることです バグレポート :
ええ、現在、プラットフォームのアクティビティ/フラグメントは対象外です。
私はこれを開いたままにしていますが、近い将来これを修正する予定はありません。
プラットフォームフラグメントを使用する人のための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");
}
});
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