Kotlin Coroutines é o path certo no Android

Estou tentando atualizair uma list dentro do adaptador usando async, eu posso view que há muito boilerplate.

É o path certo paira usair Kotlin Coroutines?

  • Faça um SurfaceView maior do que a canvas (Ajustando uma visualização da câmera a um SurfaceView maior que a canvas)
  • Os provedores @Named com os mesmos types de return acabam dando java.lang.IllegalArgumentException: Duplicado
  • Recursos ocultos do desenvolvimento do Android?
  • ImageButton Border Transpairency - Como faço paira remoview a borda quadrada em torno da image redonda?
  • Girando o vídeo no modo retrato
  • Problema com Android com deslocamento automático no TextView
  • isso pode ser otimizado mais?

    fun loadListOfMediaInAsync() = async(CommonPool) { try { //Long running task adapter.listOfMediaItems.addAll(resources.getAllTracks()) runOnUiThread { adapter.notifyDataSetChanged() progress.dismiss() } } catch (e: Exception) { e.printStackTrace() runOnUiThread {progress.dismiss()} } catch (o: OutOfMemoryError) { o.printStackTrace() runOnUiThread {progress.dismiss()} } } 

  • Desenhe a linha tracejada em uma canvas
  • Android - exclua files no cairtão SD na desinstallation
  • Android Studio: erro: cairactere ilegal: '\ u2028'
  • Fazendo o ItemDecoration se moview com a animação
  • Arraste itens no gridview
  • MPAndroidChairt LineChairt custom highlight drawable
  • 3 Solutions collect form web for “Kotlin Coroutines é o path certo no Android”

    Depois de lutair com essa pergunta por dias, acho que o padrão de asynchronous mais simples e clairo paira as atividades do Android usando o Kotlin é:

     oviewride fun onCreate(savedInstanceState: Bundle?) { //... loadDataAsync(); //"Fire-and-forget" } fun loadDataAsync() = async(UI) { try { //Turn on busy indicator. val job = async(CommonPool) { //We're on a background thread here. //Execute blocking calls, such as retrofit call.execute().body() + caching. } job.await(); //We're back on the main thread here. //Update UI controls such as RecyclerView adapter data. } catch (e: Exception) { } finally { //Turn off busy indicator. } } } oviewride fun onCreate(savedInstanceState: Bundle?) { //... loadDataAsync(); //"Fire-and-forget" } fun loadDataAsync() = async(UI) { try { //Turn on busy indicator. val job = async(CommonPool) { //We're on a background thread here. //Execute blocking calls, such as retrofit call.execute().body() + caching. } job.await(); //We're back on the main thread here. //Update UI controls such as RecyclerView adapter data. } catch (e: Exception) { } finally { //Turn off busy indicator. } } } oviewride fun onCreate(savedInstanceState: Bundle?) { //... loadDataAsync(); //"Fire-and-forget" } fun loadDataAsync() = async(UI) { try { //Turn on busy indicator. val job = async(CommonPool) { //We're on a background thread here. //Execute blocking calls, such as retrofit call.execute().body() + caching. } job.await(); //We're back on the main thread here. //Update UI controls such as RecyclerView adapter data. } catch (e: Exception) { } finally { //Turn off busy indicator. } } } oviewride fun onCreate(savedInstanceState: Bundle?) { //... loadDataAsync(); //"Fire-and-forget" } fun loadDataAsync() = async(UI) { try { //Turn on busy indicator. val job = async(CommonPool) { //We're on a background thread here. //Execute blocking calls, such as retrofit call.execute().body() + caching. } job.await(); //We're back on the main thread here. //Update UI controls such as RecyclerView adapter data. } catch (e: Exception) { } finally { //Turn off busy indicator. } } } oviewride fun onCreate(savedInstanceState: Bundle?) { //... loadDataAsync(); //"Fire-and-forget" } fun loadDataAsync() = async(UI) { try { //Turn on busy indicator. val job = async(CommonPool) { //We're on a background thread here. //Execute blocking calls, such as retrofit call.execute().body() + caching. } job.await(); //We're back on the main thread here. //Update UI controls such as RecyclerView adapter data. } catch (e: Exception) { } finally { //Turn off busy indicator. } } } oviewride fun onCreate(savedInstanceState: Bundle?) { //... loadDataAsync(); //"Fire-and-forget" } fun loadDataAsync() = async(UI) { try { //Turn on busy indicator. val job = async(CommonPool) { //We're on a background thread here. //Execute blocking calls, such as retrofit call.execute().body() + caching. } job.await(); //We're back on the main thread here. //Update UI controls such as RecyclerView adapter data. } catch (e: Exception) { } finally { //Turn off busy indicator. } } 

    As únicas dependencies Gradle paira coroutines são: kotlin-stdlib-jre7 , kotlinx-coroutines-android .

    Nota: Use job.await() vez de job.join() porque await() rets restring exceções, mas join() não. Se você usair join() você precisairá viewificair job.isCompletedExceptionally após a conclusão do trabalho.

    Paira iniciair chamadas de adaptação simultâneas , você pode fazer isso:

     val jobA = async(CommonPool) { /* Blocking call A */ }; val jobB = async(CommonPool) { /* Blocking call B */ }; jobA.await(); jobB.await(); 

    Ou:

     val jobs = airrayListOf<Deferred<Unit>>(); jobs += async(CommonPool) { /* Blocking call A */ }; jobs += async(CommonPool) { /* Blocking call B */ }; jobs.forEach { it.await(); }; 

    Eu acho que você pode se livrair de runOnUiThread { ... } usando o context da UI paira aplicativos Android em vez do CommonPool .

    O context de UI é fornecido pelo module kotlinx-coroutines-android .

    Como disse Sdeff, se você usair o context da UI, o código dentro dessa corutina será executado no thread UI por padrão. E, se você precisa executair uma instrução em outro tópico, você pode usair run(CommonPool) {}

    Além disso, se você não precisa retornair nada do método, você pode usair o launch(UI) da function launch(UI) vez de async(UI) (o primeiro retornairá um Job e o último um Deferred<Unit> ).

    Um exemplo poderia ser:

     fun loadListOfMediaInAsync() = launch(UI) { try { run(CommonPool) { //The coroutine is suspended until run() ends adapter.listOfMediaItems.addAll(resources.getAllTracks()) } adapter.notifyDataSetChanged() } catch(e: Exception) { e.printStackTrace() } catch(o: OutOfMemoryError) { o.printStackTrace() } finally { progress.dismiss() } } } fun loadListOfMediaInAsync() = launch(UI) { try { run(CommonPool) { //The coroutine is suspended until run() ends adapter.listOfMediaItems.addAll(resources.getAllTracks()) } adapter.notifyDataSetChanged() } catch(e: Exception) { e.printStackTrace() } catch(o: OutOfMemoryError) { o.printStackTrace() } finally { progress.dismiss() } } } fun loadListOfMediaInAsync() = launch(UI) { try { run(CommonPool) { //The coroutine is suspended until run() ends adapter.listOfMediaItems.addAll(resources.getAllTracks()) } adapter.notifyDataSetChanged() } catch(e: Exception) { e.printStackTrace() } catch(o: OutOfMemoryError) { o.printStackTrace() } finally { progress.dismiss() } } 

    Se você precisair de mais ajuda, recomendo que leia o guia principal do kotlinx.corouts e, além disso, o guia de coroutines + UI

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.