2012-04-04 55 views
1

来自基本的Java世界,我知道有一种方法可以通过创建一个新的Runnable并将其传递给一个新的Thread并调用它开始来产生一个线程。例如:什么是产生新线程的android优选方式?

Runnable r = new Runnable() { 
    @Override 
    public void run(){ 
    } 
} 

new Thread(r).start() 

现在加入Android世界,似乎Android生态系统提供了其他一些方法来产生线程。其中之一是Activity.runOnUiThread(用于在UI上完成的任务)和Handler.post(可运行)。

我在想什么是Android产生新线程的首选方式。我看到很多案例,例如:

Handler handler = new Handler() 
handler.post(r) 

是否有一个很好的理由使用Handler来生成一个线程,而不是创建一个新线程旧的方式?

谢谢。 Yev

回答

2

查看AysncTask framework。 Google似乎希望你处理线程......尽管你可以使用标准的Java线程。

+1

完全正确管理线程和处理程序为您服务。这里有一个很好的教程,讨论Android“线程”,“异步任务”和“处理程序”:http://www.vogella.de/articles/AndroidPerformance/article.html – paulsm4 2012-04-04 18:54:35

+0

谢谢......这解释了我的一些担忧。 – ymotov 2012-04-06 14:18:04

0

Handler不应该产生线程,而是要post新的任务到UI线程。国际海事组织的方式产卵线程是java的方式,通过直接运行或扩展线程。 Android人围绕着Async任务包装了一个Executor,并公开了直接在UI线程中运行的一些方法,以及一个在后台运行任务的方法。

1

处理程序按照您演示的方式实际上不会生成新线程。处理程序不是线程,而是IPC的一种手段,让一个线程告诉另一个线程运行代码。您仍然以旧的方式产生线程,但处理程序可以帮助这些线程更好地交流。

说,例如,你有你通常的方式在后台催生掀起了主题:

Runnable r = new Runnable() { 
    @Override 
    public void run(){ 
    } 
} 

new Thread(r).start() 

它运行在后台做处理,但它需要与更新UI它的进步,所以它回调到活动:

onProgress(int progress) { 
    // update UI 
} 

如果您运行的代码,它会抛出一个异常,因为只有UI线程被允许更新UI。处理程序可以像这样解决这个问题:

public void onProgress(int results){ mHandler.post(new UIUpdater(results)); }

private class UIUpdater implements Runnable { 
    UIUpdater(int results) { 
    //construct whatever... 
    } 

    @Override 
    public void run() { 
    //Update UI 
    } 
} 

或者,你可以拥有的Android通过AsyncTask框架

+0

谢谢JRaymond ...我认为AsyncTask是我一直在寻找的东西。 – ymotov 2012-04-06 14:18:31

相关问题