Android 架构组件:使用 LifecycleOwner 时获取 Activity 方法
Android Architecture components : Get Activity methods when using LifecycleOwner
在实现架构组件时我遇到了这个问题
import android.arch.lifecycle.Lifecycle
import android.arch.lifecycle.LifecycleOwner
import android.os.Bundle
import com.reversebits.trendyvidz.R
class MainActivity : LifecycleOwner {
override fun getLifecycle(): Lifecycle {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AppTheme) //This shows error
setContentView(R.layout.activity_main) //This shows error
init()
}
private fun init() {
when {
isNetworkAvailable() -> toast("Yes Avail")
else -> toast("No")
}
}
}
我应该如何在这里获得 Activity 基于上下文的方法,例如 AppCompatActivity 的 setContentView()
?
好的,我明白了,
我只需要这样做:
class MainActivity : AppCompatActivity(), LifecycleOwner {
因为 LifecycleOwner 只是一个只有一个方法的接口
override fun getLifecycle(): Lifecycle {
TODO("Not implemented") //To change body of created functions use File | Settings | File Templates.
}
而且我可以在实现 LifecycleOwner 之后用这个注释来注释方法。
@OnLifecycleEvent(Lifecycle.Event.ON_START) etc.
正如已经指出的那样,如果你想创建一个 Activity,你需要扩展 Activity。
除此之外,您的代码中还有几个问题:
1)
如果您使用支持库 26.1.0+ 和生命周期 1.0.0-alpha9-1+ 生命周期已经包括在内,因为
AppCompatActivity extends FragmentActivity
FragmentActivity extends SupportActivity
SupportActivity extends Activity implements LifecycleOwner
2)
如果您使用旧的支持库或生命周期,您有两个选择。
2a)
如果您的 activity 扩展了 FragmentActivity
,您将改为扩展 LifecycleActivity
,仅此而已。
2b)
如果你不能这样做,你会实施 LifecycleRegistryOwner
,例如:
class MyActivity extends AppCompatActivity implements LifecycleRegistryOwner {
private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@Override
public LifecycleRegistryOwner getLifecycle() {
return mLifecycleRegistry;
}
}
示例代码到此结束,但我没有看到任何实际调度事件的代码。在调查当前 SupportActivity
后发现它正在使用 ReportFragment
来调度所有事件。添加此以正确调度事件:
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
}
@CallSuper
protected void onSaveInstanceState(Bundle outState) {
this.mLifecycleRegistry.markState(State.CREATED);
super.onSaveInstanceState(outState);
}
还有一点,这是一个错误:
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(savedInstanceState: Bundle?) {
方法onCreate
触发了ON_CREATE
事件。不是相反。你会得到这样的堆栈溢出错误。
您在方法上使用了 @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
注释,希望在 onCreate
被调用后自动触发,而不是 onCreate
方法本身。
在实现架构组件时我遇到了这个问题
import android.arch.lifecycle.Lifecycle
import android.arch.lifecycle.LifecycleOwner
import android.os.Bundle
import com.reversebits.trendyvidz.R
class MainActivity : LifecycleOwner {
override fun getLifecycle(): Lifecycle {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AppTheme) //This shows error
setContentView(R.layout.activity_main) //This shows error
init()
}
private fun init() {
when {
isNetworkAvailable() -> toast("Yes Avail")
else -> toast("No")
}
}
}
我应该如何在这里获得 Activity 基于上下文的方法,例如 AppCompatActivity 的 setContentView()
?
好的,我明白了,
我只需要这样做:
class MainActivity : AppCompatActivity(), LifecycleOwner {
因为 LifecycleOwner 只是一个只有一个方法的接口
override fun getLifecycle(): Lifecycle {
TODO("Not implemented") //To change body of created functions use File | Settings | File Templates.
}
而且我可以在实现 LifecycleOwner 之后用这个注释来注释方法。
@OnLifecycleEvent(Lifecycle.Event.ON_START) etc.
正如已经指出的那样,如果你想创建一个 Activity,你需要扩展 Activity。
除此之外,您的代码中还有几个问题:
1)
如果您使用支持库 26.1.0+ 和生命周期 1.0.0-alpha9-1+ 生命周期已经包括在内,因为
AppCompatActivity extends FragmentActivity
FragmentActivity extends SupportActivity
SupportActivity extends Activity implements LifecycleOwner
2)
如果您使用旧的支持库或生命周期,您有两个选择。
2a)
如果您的 activity 扩展了 FragmentActivity
,您将改为扩展 LifecycleActivity
,仅此而已。
2b)
如果你不能这样做,你会实施 LifecycleRegistryOwner
,例如:
class MyActivity extends AppCompatActivity implements LifecycleRegistryOwner {
private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@Override
public LifecycleRegistryOwner getLifecycle() {
return mLifecycleRegistry;
}
}
示例代码到此结束,但我没有看到任何实际调度事件的代码。在调查当前 SupportActivity
后发现它正在使用 ReportFragment
来调度所有事件。添加此以正确调度事件:
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
}
@CallSuper
protected void onSaveInstanceState(Bundle outState) {
this.mLifecycleRegistry.markState(State.CREATED);
super.onSaveInstanceState(outState);
}
还有一点,这是一个错误:
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(savedInstanceState: Bundle?) {
方法onCreate
触发了ON_CREATE
事件。不是相反。你会得到这样的堆栈溢出错误。
您在方法上使用了 @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
注释,希望在 onCreate
被调用后自动触发,而不是 onCreate
方法本身。