android-Anko doAsyncResult协程

android-Anko doAsyncResult协程,第1张

概述我是anko和coroutines的新手,所以请问一些琐碎的问题吧:)所以我想做的是让用户单击一个按钮,然后我要从互联网下载JSON,将其存储在本地并解析.由于这两种 *** 作都需要花费大量时间,因此我考虑使用anko协程.所以第一个问题是:1.我可以使用嵌套的doAsync调用,在第一个UIThread中调用第

我是anko和coroutines的新手,所以请问一些琐碎的问题吧:)

所以我想做的是让用户单击一个按钮,然后我要从互联网下载JSON,将其存储在本地并解析.由于这两种 *** 作都需要花费大量时间,因此我考虑使用anko协程.

所以第一个问题是:

1.我可以使用嵌套的doAsync调用,在第一个UIThread中调用第二个doAsync吗?
我尝试了一下,它似乎可以正常工作,但是感觉不对,所以我试图找到一种更优雅的方法

例:

doAsync {            downloadfileFromUrl(fileUrl)            uiThread {                doAsync {                    IoUtils.parsefile(context!!)                    val database = AppDatabase.getInstance(context!!)                    val results = database.resultsDao().all                    uiThread {                        //show Results                    }                }            }        }

2.在寻找问题的解决方案时,我发现了doAsyncResult.如果1不正确,这是正确的方法吗?我已经尝试使用它,但是使用布尔值时会出错.见下文:

    private fun downloadfileFromUrl(fileUrl: String): Boolean {        try{        //Download file. No doAsync calls here.        //The procedure just returns true if successful or false in case of any errors            return true        } catch (e: Exception) {            Log.e("Error: ", e.message)            return false        }    }    overrIDe fun onVIEwCreated(vIEw: VIEw, savedInstanceState: Bundle?) {        super.onVIEwCreated(vIEw, savedInstanceState)        parsebutton.setonClickListener {            try {                val downloadfileResult: (AnkoAsyncContext<Boolean>.() -> Boolean) = {                    ::downloadfileFromUrl.invoke(fileUrl)                }                val downloadfileResultFutureValue: Future<Boolean> = doAsyncResult(null, downloadfileResult)                //Continue processing if downloadfileResultFutureValue is true            } catch (e: IOException) {                e.printstacktrace()            }        }    }

这条线

val downloadfileResultFutureValue: Future<Boolean> = doAsyncResult(null, downloadfileResult)

无法编译以下错误,但我不知道如何解决:

Type inference Failed: Cannot infer type parameter T in fun <T, R> T.doAsyncResult(exceptionHandler: ((Throwable) → Unit)? = ...,task: AnkoAsyncContext<T>.() → R): Future<R>None of the following substitutionsreceiver: Booleanarguments:(((Throwable) → Unit)?,AnkoAsyncContext<Boolean>.() → Boolean)receiver: BlankFragmentarguments:(((Throwable) → Unit)?,AnkoAsyncContext<BlankFragment>.() → Boolean)can be applIEd toreceiver: BlankFragmentarguments:(nothing?,AnkoAsyncContext<Boolean>.() → Boolean)

提前致谢

解决方法:

这样做:

doAsync {   // 1. Something   uiThread {      // 2. nothing      doAsync {

确实没有多大意义,除非(2)不是什么,而您只是省略了一些代码.
如果没有,则可以使用以下版本:

doAsync {   downloadfileFromUrl(fileUrl)   IoUtils.parsefile(context!!)   val database = AppDatabase.getInstance(context!!)   val results = database.resultsDao().all   uiThread {      //show Results   }}

由于parsefile()无论如何都依赖于downloadfileFromUrl(),并且所有内容都在协程中运行,因此通过反复添加来实现并发不会变得更加并行.

总结

以上是内存溢出为你收集整理的android-Anko doAsyncResult协程全部内容,希望文章能够帮你解决android-Anko doAsyncResult协程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1081358.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存