2013-02-28 5 views
40

私は思ったんだけどにhandler.post()&するときに使用するときは:新しいスレッド()私は<code>handler.post(runnable);</code>を使用する必要があると私は <code>new Thread(runnable).start();</code></p> <p>を使用する必要があるときには、ハンドラのために、開発者のドキュメントに記載されている場合

Runnable rをメッセージキューに追加させます。実行可能ファイル は、このハンドラが接続されているスレッド上で実行されます。

私はonCreate()Activityのクラスで書くならば、これはどういう意味:その後、

Handler handler = new Handler(); 
handler.post(runnable); 

実行可能では別のスレッドでまたはアクティビティのスレッドで呼び出されますか?

答えて

64

UIスレッドで操作を行う場合はいつでもHandler.post()を使用する必要があります。

したがって、別のスレッドで実行されているコールバックでTextViewのテキストを変更する場合は、Handler.post()を使用します。

他の多くのUIフレームワークと同様に、UIエレメント(ウィジェット)はメインスレッドからしか変更できません。


編集:長時間実行中のタスクもちろん

mHandler = new Handler(); 

new Thread(new Runnable() { 
    @Override 
    public void run() { 
    // Perform long-running task here 
    // (like audio buffering). 
    // you may want to update some progress 
    // bar every second, so use handler: 
    mHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     // make operation on UI - on example 
     // on progress bar. 
    } 
    }); 
    } 
}).start(); 

の例では、実行するタスクが実際の長さで、ユーザがいくつかの他のアプリを切り替えるかもしれないという恐れがある場合その間はServiceの使用を検討する必要があります。

+0

しかし、もし私がインターネットからのオーディオストリームをバッファリングしたいとしたら。私はhandler.postまたは新しいスレッドでそれを行う必要がありますか? – reiley

+1

本当にあなたの要件に依存します。新しいスレッドやサービスのいずれかを検討します。私は秒での例で答えを更新します。 – kamituel

11

例が怒っている:

mHandler = new Handler(); 
new Thread(new Runnable(){ 
    @Override 
    public void run() { 
    mHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     mUiView.setX(x); 
    } 
    }); 
    } 
}).start(); 

別の方法としては、ハンドラをスキップすることができますし、直接ビューにPOSTメソッドを使用します。

new Thread(new Runnable(){ 
    @Override 
    public void run() { 
    mUiView.post(new Runnable() { 
    @Override 
    public void run() { 
     mUiView.setX(x); 
    } 
    }); 
    } 
}).start(); 

これは違いを概説良いポストです:What exactly does the post method do?

18

具体的な質問にお答えします:

これは、アクティビティクラスIのonCreateで次のように書くことを意味しますか。

ハンドラハンドラ=新しいハンドラ()hanlder.post(実行可能);実行可能ファイル は別のスレッドまたはアクティビティのスレッドで呼び出されますか?

いいえ、それはできません。 Runnableはメインスレッド自体で呼び出されます。 ハンドラは、メッセージが添付されているスレッド(作成されている場所)にメッセージをポストするために使用されます。 独自のスレッドは作成されません。 例では、メインスレッド(Activity.OnCreate()が呼び出された場所)にハンドラを作成したため、そのようなハンドラに投稿されたメッセージはメインスレッドのみで実行されます。

+3

正しい答えが必ずしも最良とは限りません。ありがとう –

+0

あなたは私のアプリのパーフェクトを完全に変えました!ハンドラからスレッドに移動するだけで、私のアプリが飛んできました!とても大きな感謝の男! – Mitchapp

2

使用handler.post()あなたはポストにしたいコード(通常はバックグラウンドスレッドから)メインスレッドへ。そうです、POST、あなたのように、手紙を誰かに投稿してください。 ハンドラの助けを借りて、コードはできるだけ早く実行されます。

関連する問題

 関連する問題