我开始学习android编程并正在开发一个小游戏。我听说做后台操作或更新或下载或任何后台和耗时的事情不应该使用 ui 线程来完成,而是使用线程/可运行或异步任务。但我无法在线程中执行一些操作,例如与数据库的后台连接,因为此连接与剩余的处理程序、runonuithread、asynctask 一起使用。我非常困惑在哪里使用哪个。
我有一些疑问
1.handler、runonuithread 都在 ui 线程上运行,thread/runnable 是不同的线程,在异步任务中,doinbackground 方法在不同线程上运行,其他方法(如 onprogressupdate、onpreexecute 和 onpostexecute)在 ui 线程上运行。正确的?
如果是这样,我编写了一个程序来与线程/可运行数据库进行连接,但它不起作用,但是当我在 doinbackground 中编写它时,它起作用了。我的困惑是,由于这两种方法都在不同的线程上运行,为什么会发生这种情况。
2.这4者的主要区别是什么?它们适用和不适用的地方。
并且还想知道只有 ui 线程可以执行哪些任务。
感谢在副词:)
A Handler
允许您发布要在主 UI 线程上执行的消息。Activity#runOnUiThread(Runnable)
是一种方便的方法,使用Handler
内部发布一个Runnable
在 UI 线程上(参见源代码 https://github.com/android/platform_frameworks_base/blob/lollipop-release/core/java/android/app/Activity.java#L5243-L5249). Handler
s 通常用于将后台线程上生成的事件与主 UI 线程同步。例如,自从View
s 和其他 UI 小部件不能直接在后台线程上修改,后台线程可能会发布一条消息,在主 UI 线程上而不是在后台进行这些修改。
An AsyncTask
是一个实用程序类,它使用线程池来执行任务并提供有用的回调方法(即onPreExecute
, onPostExecute
等)保证在主 UI 线程上执行(换句话说,它抽象了Handler
来自开发商)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)