Компоненты архитектуры 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.
Другие вопросы по тегам