我是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协程所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)