LifecycleObserverでLifecycleOwnerを取得して、ViewModelオブザーバーに渡す必要があります。
これは私のMainActivityであり、LifecycleObserverを追加しました。
public class MainActivity extends AppCompatActivity implements LifecycleOwner{
private LifecycleRegistry mLifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, MainFragment.newInstance())
.commitNow();
}
mLifecycleRegistry=new LifecycleRegistry(this);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
getLifecycle().addObserver(new MyLifecycleObserver());
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
そして、これは私のオブザーバーであり、LifecycleOwnerが必要です。
public class MyLifecycleObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStartListener(){
FirebaseMassage.startFirebase();
MainFragment.massageViewModel.getMassage().observe(/*here I need the LifecycleOwner*/, textMassage -> {
FirebaseMassage.updateFirebaseMassage(textMassage);
});
}
}
別の署名を使用して、次のようなLifecycleOwner
を取得できます。
public class MyLifecycleObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStartListener(LifecycleOwner owner){
...
}
}
オブザーバーメソッドはゼロまたは1つの引数を受け取ることができます。使用する場合(引数をゼロにすることもできますが、[〜#〜] iff [〜#〜]引数を使用することを意味します)、最初の引数はタイプLifecycleOwnerである必要があります。 Lifecycle.Event.ON_ANYでアノテーションが付けられたメソッドは、2番目の引数を受け取ることができます。これは、タイプLifecycle.Eventである必要があります。
class TestObserver implements LifecycleObserver {
@OnLifecycleEvent(ON_CREATE)
void onCreated(LifecycleOwner source) {
//one argument possible
}
@OnLifecycleEvent(ON_START)
void onCreated() {
//no argument possible
}
@OnLifecycleEvent(ON_ANY)
void onAny(LifecycleOwner source, Event event) {
//two argument possible only for ON_ANY event
}
}
独自のLifecycleRegistryを実装する必要はありません。AppCompatActivityから入手できるものを使用するだけです。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, MainFragment.newInstance())
.commitNow();
}
getLifecycle().addObserver(new MyLifecycleObserver());
}
}
StartFirebase呼び出しとviewmodelオブザーバーを分離すると、フラグメント内のviewmodelからの変更を直接観察できます。
MyLifecycleObserverは、ON_STARTが発行されるとfirebase呼び出しを開始します。
public class MyLifecycleObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStartListener(){
FirebaseMassage.startFirebase();
}
}
MainFragmentはViewModelを直接監視します。
public class MainFragment extends Fragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
massageViewModel.getMassage().observe(this, textMassage -> {
FirebaseMassage.updateFirebaseMassage(textMassage);
});
}