通过书籍和线程学习Android是一个菜鸟我看到书中有三种主要方法:
所有3个似乎都很好,我的问题是:
是否有特定时间使用上述其中一种?或者这是个人偏好吗?
编辑:
如果不是个人喜好,请举例说明何时使用其中一个(如果不是其他链接)
因为我计划运行多个线程(例如,一个用于总应用运行时间,一个用于在应用中选择应答之前的时间等,一个用于移动背景图像等)并且想要知道选择哪个。我可以使用这3种方法中的任何一种来完成我想要的功能,所以很困惑为什么有3种方法可以用任何一种方法完成。
谢谢!
答案 0 :(得分:2)
Handler是一种非常基本的方法,允许您在不同的线程(通常是UI线程)上执行某些代码。它没有告诉你如何运行你的线程,你可以自由地做任何你想做的事情。如果您有明确的消息,我会选择handleMessage
方法。那就是你需要发送和接收一些数据。如果您只是需要做某事,可以使用Runnable
。但是,这两种方法都是可用的,并且通常会选择偏好。
AsyncTask
是更高级别的概念,它使用处理程序。如果您使用它,您将不必自己处理线程。您的异步代码将通过线程池执行并由框架控制。您将有两种方法可以在UI线程(onPostExecute
和onProgressUpdate
)上执行代码。
简而言之,对于您使用多个线程执行的大多数事情,请选择AsyncTask
,这将免除您自己处理线程管理的需要。如果您必须拥有自己的线程,那么请使用处理程序。但请注意,还有其他情况需要使用处理程序。例如,使用Messenger
。我使用onProgressUpdate
时的情况还不够。在这种情况下,我也会使用来自doInBackground
的处理程序。
答案 1 :(得分:1)
AsynTasks可能最适合复杂的任务,比如当你需要大量的处理和大量的消息传递时。你也可以通过Handler实现它们,但就个人而言,你的代码会变得有点混乱。
答案 2 :(得分:1)
处理程序:绑定到创建它的线程。 Queue / Enqueue在消息队列中的任务。当它将消息排入队列时,它会将其交给另一个创建消息的线程。把它想象成线程的代理。它负责发送给它的请求并相应地委托它们。
发布/消息:如上所述,它只是处理程序发布(排队)或消息(排队)。
Asynctask:一个线程主要用于需要在后台完成的小任务,并根据其进度更新UI(想想加载栏或下载; UI正在使用该进度进行更新)。
答案 3 :(得分:0)
查看Needle,你可以忘记处理程序和Asynctasks。 Needle是一款开源,简单但功能强大的Android多线程库。有了它,你可以说:
Needle.onMainThread().execute(new Runnable() {
@Override
public void run() {
// e.g. change one of the views
}
});
或
Needle.onBackgroundThread().execute(new UiRelatedTask<Integer>() {
@Override
protected Integer doWork() {
int result = 1+2;
return result;
}
@Override
protected void thenDoUiRelatedWork(Integer result) {
mSomeTextView.setText("result: " + result);
}
});
在GitHub上查看:https://github.com/ZsoltSafrany/needle