如何在LifecycleObserver中获取LifecycleOwner?

16

我需要在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个回答

17

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

public class MyLifecycleObserver implements LifecycleObserver {


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

1
@OnLifecycleEvent已被弃用。请参考https://developer.android.com/jetpack/androidx/releases/lifecycle#2.4.0-beta01。 - Akito

4
观察者方法可以接收零个或一个参数。如果使用(也就是说您也可以使用零个参数,但仅当使用参数时),第一个参数必须是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
             }
}

你能提供一个文档链接吗? - pallgeuer
@pallgeuer https://developer.android.com/topic/libraries/architecture/lifecycle#lc - Abhishek Kumar
谢谢。我特别在寻找LifecycleOwner可以作为OnLifecycleEvent注释的函数的参数进行传递的文档。这个有文档记录吗? - pallgeuer
@OnLifecycleEvent已被弃用。请参考https://developer.android.com/jetpack/androidx/releases/lifecycle#2.4.0-beta01。 - Akito

3

你不需要实现自己的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 observer分开,那么就可以直接在fragment中观察到viewmodel的变化,即:

当ON_START被发出时,MyLifecycleObserver开始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);
      });
  }

@OnLifecycleEvent已被弃用。请参考https://developer.android.com/jetpack/androidx/releases/lifecycle#2.4.0-beta01。 - Akito

2

由于@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
    }
}

1
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已被弃用。请参考https://developer.android.com/jetpack/androidx/releases/lifecycle#2.4.0-beta01。 - Akito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接