我开始学习android编程,正在开发一款小游戏。我听说不应该使用ui线程进行后台操作或更新或下载或任何背景和耗时的事情,而是使用thread / runnable或asynctask。但我不能在线程中做一些事情,比如后台连接到数据库,因为这种连接与剩余的处理程序一起工作,runonuithread,asynctask.am极大地混淆了在哪里使用哪一个。 我有一些问题 1.handler,runonuithread都在ui线程上运行,thread / runnable是一个不同的线程,在异步任务中,doinbackground方法在不同的线程上运行,其他方法如onprogressupdate,onpreexecute和onpostexecute在ui线程上运行。对? 如果是这样我写了一个程序与线程/ runnable做数据库连接它没有用,但当我在doinbackground写它时它工作。我的困惑在于,因为这两种方法都在不同的线程上运行,为什么会发生这种情况。 2.这些4的主要区别是什么?它们适用哪里不适用。 并且还想知道只有ui线程才能完成的任务。 感谢adv:)
答案 0 :(得分:4)
Handler
允许您发布要在主UI线程上执行的消息。 Activity#runOnUiThread(Runnable)
是一种便捷方法,它在内部使用Handler
在UI线程上发布Runnable
(请参阅source code)。 Handler
通常用于将后台线程上生成的事件与主UI线程同步。例如,由于View
和其他UI小部件无法直接在后台线程上修改,因此后台线程可能会发布一条消息,在主UI线程上而不是在后台执行这些修改。
AsyncTask
是一个实用程序类,它使用线程池来执行任务,并提供有用的回调方法(即onPreExecute
,onPostExecute
等),这些方法可以保证在主UI线程(换句话说,它从开发人员那里抽象出Handler
s的想法。)
答案 1 :(得分:2)
您好我会尽量给您最简单的解释!
Thread是一个允许您使用groovy Multitasking的类。这是一个标准的Java类。每个Java环境(在您的情况下都是Android)都可以使用它。
Runnable是一个与Thread类几乎相同的接口,但它更简单一些。为了使用它,您只需要实现方法run()。
Handler是一个更加花哨的,Android特定的Thread类变体。有一些特定的功能和其他有用的东西。
RunOnUiThread是一个方法,它允许我们访问Android中的主线程或a.k.a. UI线程!是的,再次这个简单的单词Thread!因为在Android中你不能从另一个线程修改UI,除了主(或a.k.a.用户界面)线程,谷歌提供了一种方法来访问这个线程。
AsyncTask是最有价值,最酷的课程!它旨在简化我们作为开发人员的生活,并在Android环境中做得最好。它可以再次被视为一个线程,但“简化”和“统一”。这意味着使用AsyncTask简单,容易且非常有用!
AsyncTask是c00l,这就是为什么我会给你一个简短的描述:
要使用它,最好在您的类中扩展AsyncTask。比你需要实现3种方法!是的,只有三个!
第一个用作“准备”。在这个方法中,所有发生的事情都是在新的并行线程启动之前。
第二个用于在新线程中执行你的JOB !! 1
最后(第三个)用于在新创建的线程中完成工作后执行某些任务。
如果您对此感兴趣,我确信您可以找到几十个教程和示例向您解释,但我的意见是您只需要尝试所有这些!
<强>记住强> 最重要的是在最需要的时候使用建筑。当您可以使用更简单的结构时,请勿使用复杂的结构。当然,有AsyncTask或Handler类并非巧合,它们是为了帮助我们!
祝你好运,我希望这个简短而垃圾的解释不会太混乱。