Компоненты архитектуры 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") 
        }
    }
}

Как я могу получить контекстные методы Activity, такие как setContentView() из AppCompatActivity?


person TapanHP    schedule 19.09.2017    source источник


Ответы (2)


Как уже отмечалось, если вы хотите создать Activity, вам нужно расширить Activity.


Кроме того, в вашем коде есть пара проблем:

1)

Если вы используете библиотеку поддержки 26.1.0+ и жизненные циклы 1.0.0-alpha9-1+, жизненные циклы уже включены, потому что

AppCompatActivity extends FragmentActivity 
FragmentActivity extends SupportActivity 
SupportActivity extends Activity implements LifecycleOwner

2)

Если вы используете старые библиотеки поддержки или жизненные циклы, у вас есть два варианта.

2a)

Если бы ваша деятельность расширила 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.

person Eugen Pechanec    schedule 20.10.2017

Хорошо, я понял,
мне просто нужно сделать следующее:

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.
person TapanHP    schedule 19.09.2017
comment
Это означает, что краткий ответ заключается в том, что вы забыли расширить Activity, верно? - person Eugen Pechanec; 19.10.2017
comment
Да, просто введите код на случай, если кто-то захочет передать его @EugenPechanec - person TapanHP; 20.10.2017