Sanu0074
@Sanu0074

Как можно ли оптимизировать код с помощью coroutines?

Вопрос может показаться тупым т.к. я недавно начал изучать coroutines, но все же.
Допустим есть такой класс:
class MainActivity : AppCompatActivity(), CoroutineScope {

    private var job: Job = Job()
    override val coroutineContext: CoroutineContext
        get() = Dispatchers.Main + job

    override fun onCreate(savedInstanceState: Bundle?) {
        launch {
            var user: UserData? = service.doLogin("test", "1111")
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        job.cancel()
    }

}

Метод doLogin выглядит так:
suspend fun doLogin(login: String, pass: String): UserData? {
        return try {
            service.logIn(login, pass).await()
        } catch (e: Exception) {
            e.printStackTrace()
            null
        }
    }


Это все работает как нужно, но, вопрос заключается в следующем: можно ли как-то так написать код, что б вызов service.doLogin() не нужно было оборачивать в launch?
Т.е. на подобие того как это работало бы в javascript (синтаксический пример):
async onCreate(savedInstanceState: Bundle?) {
    var user: UserData? = await service.doLogin("test", "1111")
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
}

Мы ведь не можем написать так: override suspend fun onCreate.
Может можно каким-либо образом написать аннотацию @launch(), которая бы выполнила код onCreate в CoroutineScope. Или же все это дурацкая затея?
  • Вопрос задан
  • 88 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Tiberal
Можете рассматривать suspend как точку останова в корутине. Соответственно suspend методы вызываются только в корутинах (launch, async, runBlocking, actor). Методы sdk вы не можете делегировать как suspend , т.к. они вызываются внутри фреймфорка , где никто не знает о ваших корутинах.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы