2012-04-04 14 views
1

私は基本的なJavaの世界から来て、私は新しいRunnableを作成し、それを新しいスレッドに渡してスレッドを起動する方法があることを知っています。次のようなものがあります:新しいスレッドを作成するためのアンドロイドの好きな方法は何ですか?

Androidの環境に参加すると、スレッドをスポーンする方法がいくつか用意されているようです。それらの1つはActivity.runOnUiThread(UIで処理されたもの)とHandler.post(実行可能)です。

私は、Androidが新しいスレッドを産み出すのに好ましい方法は何だろうと思っています。

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

新しいスレッド古い道を作るとは対照的に、スレッドを生成するためにハンドラを使用するには十分な理由があります:私は、次のような多くの例を参照していますか?

ありがとうございました。 Yev

答えて

2

AysncTask frameworkをご覧ください。それは、あなたが標準のJavaスレッドを使用することはできますが、Googleがあなたにスレッドを処理させたいと思う方法です。

+1

を通じてあなたのためのスレッドとハンドラを管理することができます。ここでは、Androidの「スレッド」、「非同期タスク」、「ハンドラー」について説明する偉大なチュートリアルです:http://www.vogella.de/articles/AndroidPerformance/article.html – paulsm4

+0

ありがとう...私の懸念事項のいくつかを説明しています。 – ymotov

0

ハンドラはスレッドを生成するはずではなく、post新しいタスクをUIスレッドに割り当てます。 IMOスレッドを生成する方法は、Javaの方法です。実行可能スレッドまたは拡張スレッドを直接使用します。アンドロイドの人たちは、非同期タスクの周りにExecutorをラップし、UIスレッドで直接実行するメソッドと、バックグラウンドでタスクを実行するメソッドを公開しました。

1

あなたが実証した方法でのハンドラは、実際には新しいスレッドを生成しません。ハンドラはスレッドではなく、あるスレッドが別のスレッドにコードを実行させるようにするための手段です。同じ古い方法でスレッドを生成しますが、Handlerはそれらのスレッドがよりうまく通信できるようにします。

言って、たとえば、あなたが通常の方法で、バックグラウンドでオフ生み出してきたスレッドを持っている:

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

関連する問題