Компоненты архитектуры Android: получите методы Activity при использовании 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")
}
}
}
Как я полагаю, чтобы получить методы, основанные на контексте деятельности здесь, как setContentView()
AppCompatActivity?
2 ответа
Как уже указывалось, если вы хотите создать Активность, вам нужно расширить Активность.
Кроме этого в вашем коде есть несколько проблем:
1)
Если вы используете библиотеку поддержки 26.1.0+ и жизненные циклы 1.0.0-alpha9-1+ жизненные циклы уже включены, потому что
AppCompatActivity extends FragmentActivity
FragmentActivity extends SupportActivity
SupportActivity extends Activity implements LifecycleOwner
2)
Если вы используете старые библиотеки поддержки или жизненные циклы, у вас было два варианта.
2а)
Если ваша деятельность расширилась 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
сам метод.
Хорошо, я понял это,
Мне просто нужно сделать это:
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.