如何获取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的回答官方文档来自这里:
这是文档本身:
观察者方法可以接收零个或一个参数。如果使用,第一个参数必须是 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
}
}
我需要在 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的回答官方文档来自这里:
这是文档本身:
观察者方法可以接收零个或一个参数。如果使用,第一个参数必须是 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
}
}