2012-03-30 12 views
0

これは私の最初のStackOverflowに関する質問ですので、あいまいさがあれば謝ります。Androidハンドラ内からコールバックを行う方法をお探しの場合

私はAndroidハンドラからコールバックを受信する方法を探しています。

たとえば、アクティビティ内からハンドラが呼び出された場合、コールバックを受け取る適切な方法は何ですか。これは、そのアクティビティ内の画面上のテキストを変更するとします。

ありがとうございます!この時点で-Yevgeniy

public class MyHandler extends Handler{ 
    @Override 
    public void handleMessage (Message msg) { 
    //Do something 

    // ???send back the result to the called activity??? 
    } 
} 

public class MyActivity extends Activity{ 

    public void callHandler(){ 
    MyHandler handler = new MyHandler(); 
    handler.sendEmptyMessage(0); 
    } 

} 
+1

どのサンプルプログラムを試しましたか? – dldnh

答えて

0

、あなたが示されたものから、ポイントの多くは、すべてのハンドラを持つにはありません。ハンドラは、同じスレッド内でタスクをスケジューリングするためにsoleyを作成するスレッドにアタッチされるメカニズムです。したがって、callHandlerが別のスレッドによって呼び出された場合、ハンドラはcallHandlerを呼び出したスレッドが何であっても実行されます。私はAndroidのIPCのために最も成功を見つけたモデルは、そのタスクが完了したときに....非同期タスクを開始している、これは簡単に、何本

public class myActivity extends Activity { 
    public Handler mHandler = new Handler() 

    public void startAsynchronousTask() { 
    // Fill in as necessary, or offload responsibility elsewhere 
    new Thread(new Runnable() { 
     public void run { 
     //Do something in the background 
     ... 
     updateUI(results) 
     } 
    }).start(); 
    } 

    public void updateUI(Results results) { 
    mHandler.post(new UIUpdater(results)); 
    } 

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

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

のようなものです、それはのupdateUIを呼び出します。 updateUIは、実行されるコードをUIスレッドに入れ、ビューを変更できるようにします。このように、非同期タスクに関する限り、UIを更新するメソッドを呼び出すだけです。実際には、状況はもう少し複雑ですが、アクティビティのインターフェイスをきれいにして、非同期タスクに使いやすくしています。

+0

ありがとう!これは非常に面白いです。別の実行可能ファイルをポストするハンドラにupdateUIが必要なのはなぜですか?あなたはasynchタスクを最初からやっているので、UIをそのRunnableの一部として更新するだけでしょうか? – ymotov

+0

あなたの非同期タスクがあなたのアクティビティクラスの一部でないかもしれないという考えがあります。他のクラスでこのアクティビティをコールバックとして登録している場合、他のクラスはハンドラ/実行可能ビジネスについて知ることなくupdateUIを呼び出すことができます。非同期タスクがアクティビティ内から実行される場合は、非同期タスク内からUIUpdaterをポストすることができます。特別な方法は、コードの明瞭さのためです。 – JRaymond

+0

Cool。私はそれが好きだと思う。ありがとう。 – ymotov

関連する問題