首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Anko doAsyncResult协同线

Anko doAsyncResult协同线
EN

Stack Overflow用户
提问于 2018-08-21 20:33:55
回答 1查看 1.5K关注 0票数 5

我对anko和coroutines很陌生,所以如果我问的是一些琐碎的事情,请原谅:)

所以我要做的是让用户点击一个按钮,然后我想从互联网下载一个JSON,在本地存储并解析它。由于这两项手术都需要相当长的时间,我想使用anko协同。

所以第一个问题是:

1.我可以使用嵌套的doAsync调用,在第一个调用的UIThread中调用第二个doAsync吗?我试过了,看起来很有效,但感觉不对,所以我想找一种更优雅的方法,

示例:

代码语言:javascript
复制
doAsync {
            downloadFileFromUrl(fileUrl)

            uiThread {
                doAsync {
                    IOUtils.parseFile(context!!)
                    val database = AppDatabase.getInstance(context!!)
                    val results = database.resultsDao().all

                    uiThread {
                        //show Results
                    }
                }
            }
        }

2.在为我的问题寻找解决方案时,我找到了doAsyncResult。如果它不正确,这是正确的方法吗?我已经试过使用它了,但是使用布尔值,我得到了错误。见下文:

代码语言:javascript
复制
    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()
            }
        }
    }

这条线

代码语言:javascript
复制
val downloadFileResultFutureValue: Future<Boolean> = doAsyncResult(null, downloadFileResult)

不使用以下错误进行编译,而我不知道如何修复:

代码语言:javascript
复制
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 substitutions

receiver: Boolean
arguments:
(
((Throwable) → Unit)?,
AnkoAsyncContext<Boolean>.() → Boolean
)

receiver: BlankFragment
arguments:
(
((Throwable) → Unit)?,
AnkoAsyncContext<BlankFragment>.() → Boolean
)
can be applied to

receiver: BlankFragment
arguments:
(
Nothing?,
AnkoAsyncContext<Boolean>.() → Boolean
)

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-22 16:13:55

这样做:

代码语言:javascript
复制
doAsync {
   // 1. Something
   uiThread {
      // 2. Nothing
      doAsync {

确实没有什么意义,除非(2)不是什么,而且您只是省略了一些代码。

如果你不这么做,你可以继续使用这个版本:

代码语言:javascript
复制
doAsync {
   downloadFileFromUrl(fileUrl)
   IOUtils.parseFile(context!!)
   val database = AppDatabase.getInstance(context!!)
   val results = database.resultsDao().all

   uiThread {
      //show Results
   }
}

因为parseFile()无论如何都依赖于downloadFileFromUrl(),而且一切都在一个协同线中运行,所以通过反复添加这个元素,您不会变得更加并发。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51956326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档