web-dev-qa-db-ja.com

LifecycleObserverでLifecycleOwnerを取得するにはどうすればよいですか?

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

    }
}
5
Alex G

別の署名を使用して、次のようなLifecycleOwnerを取得できます。

public class MyLifecycleObserver implements LifecycleObserver {


    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStartListener(LifecycleOwner owner){
        ... 
    }
}
2
jaychang0917

オブザーバーメソッドはゼロまたは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
             }
}
0
Abhishek Kumar

独自の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);
      });
  }
0
Chris