鉴于以下流程:
我希望这些线程执行的方法:
OnClick
(按系统):uiOnRefresh
(1) : 用户界面ReadDb
(2) : 工人SetData
(3) : 用户界面我可以通过ReadDb
async和await来实现这一点,但它会冻结 UI 线程。
你可以认为这不涉及实施办法的Interactors
,AsyncTask
等等?
谢谢。
编辑
我正在寻找一个优雅的解决方案,请避免在每个方法中使用像new Handler (Looper.getMainLooper()).post(...)
,这样的包装器。RunOnUiThread
View
最简单的方法是使用taskt
和await
:
async OnRefresh() {
data = await m.ReadDb()
v.SetData(data)
}
但是,UI 冻结在await m.ReadDb()
. 我认为因为OnRefresh
返回void
它会返回并完成父方法 ( OnClick
) 的执行。然后,一旦await
完成,它就会执行v.SetData(d)
。出于某种原因,这不是我得到的输出。
其实我的做法是对的,但是实现的不对。我希望await m.ReadDb()
在工作线程中运行,但事实并非如此。这样做的原因是,我必须明确要求它,Task.Run
并且await
它:
OnRefresh()
{
var d = await Task.Run (() => m.ReadDb());
v.SetData(d)
}
只是写入await
不会创建新线程,这就是 UI 被阻塞的原因。
检查我在 SO 中的另一个问题,在那里向我指出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句