如何获取LifecycleObserver中的LifecycleOwner?

How to get LifecycleOwner in LifecycleObserver?

我需要在 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);
        });

    }
}

您不需要实现自己的 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 调用和视图模型观察器分开,您可以直接在片段中观察视图模型的变化,即

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

您可以使用另一个签名来获得 LifecycleOwner,例如:

public class MyLifecycleObserver implements LifecycleObserver {


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

观察者方法可以接收零个或一个参数。如果使用(意味着你也可以使用零参数,但使用 IFF 个参数),第一个参数必须是 LifecycleOwner 类型。注解为Lifecycle.Event.ON_ANY的方法可以接收第二个参数,必须是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
             }
}

Abhishek Kumar的回答官方文档来自这里:

https://developer.android.com/reference/androidx/lifecycle/Lifecycle#subclasses-direct:~:text=Observer%20methods%20can%20receive%20zero%20or%20one%20argument

这是文档本身:

观察者方法可以接收零个或一个参数。如果使用,第一个参数必须是 LifecycleOwner.

类型

注解为Lifecycle.Event.ON_ANY的方法可以接收第二个参数,必须是Lifecycle.Event类型。

 class TestObserver implements LifecycleObserver {
   @OnLifecycleEvent(ON_CREATE)
   void onCreated(LifecycleOwner source) {}
   @OnLifecycleEvent(ON_ANY)
   void onAny(LifecycleOwner source, Event event) {}
 }

由于 @OnLifecycleEvent 已弃用,我认为最好的方法是实施 LifecycleObserver 并覆盖生命周期方法:

class TestObserver: LifecycleObserver {

    override fun onCreate(owner: LifecycleOwner) {
        super.onCreate(owner)
        // your code
    }

    override fun onResume(owner: LifecycleOwner) {
        super.onResume(owner)
        // your code
    }
}