来自Java的基础世界,我知道有一种方法可以通过创建一个新的Runnable并将其传递给一个新线程并在其上调用start来生成线程
Runnable r = new Runnable() {
@Override
public void run(){
}
}
new Thread( r ).start()
现在加入安卓世界,安卓生态系统似乎提供了一些其他方式来生成线程。其中之一是Activity.runOnUiThread(用于在UI上完成任务)和Handler.post(可运行)。
我想知道的是,Android更喜欢什么方式来生成新线程。我确实看到了很多案例,比如:
Handler handler = new Handler()
handler.post( r )
有没有充分的理由使用Handler来生成线程,而不是用旧的方式创建新的线程?
谢谢。Yev
查看AysncTask框架。这似乎就是谷歌希望你处理线程的方式。。。尽管您可以使用标准的java线程。
您演示的处理程序实际上并没有生成新线程。句柄不是线程,而是IPC的一种方式,让一个线程告诉另一个线程运行代码。您仍然可以用同样的老方法派生线程,但处理程序可以帮助这些线程更好地进行通信。
例如,你有一个线程,你以通常的方式在后台生成:
Runnable r = new Runnable() {
@Override
public void run(){
}
}
new Thread( r ).start()
它在后台运行进行处理,但它需要根据进度更新UI,因此它调用回Activity:
onProgress(int progress) {
// update UI
}
如果按原样运行该代码,它将引发异常,因为只有UI线程可以更新UI。处理者可以这样解决这个问题:
public void onProgress(int个结果){mHandler.post(新的UIUpdater(结果));}
private class UIUpdater implements Runnable {
UIUpdater(int results) {
//construct whatever...
}
@Override
public void run() {
//Update UI
}
}
或者,您可以让Android通过AsyncTask框架
处理程序不应该派生线程,而是将新任务post
到UI线程。IMO生成线程的方式是java方式,直接通过可运行或扩展的线程。安卓团队在Async任务周围封装了一个Executor,并公开了一些直接在UI线程中运行的方法,以及一个在后台运行任务的方法。