2013-05-01 4 views
6

私は画面上にいくつかのコンテンツを示すアクティビティを持っていると言います。いくつかのメソッド(asyncMethod)を非同期で実行する必要があり、完了したら画面上のデータを更新する必要があります。これを行う最も正確で簡単な方法は何ですか?Androidで非同期的にメソッドを実行する最適な方法(コンパクトで正確)

現在、私が知っている最も簡単な方法は、スレッドを使用している:

new Thread(new Runnable() {   
    public void run() { 
     asyncMethod();    
    } 
}).start(); 

私はAsyncTask精通んだけど、それは、スレッドを使用するよりも、より複雑であると私は非同期的に実行する必要が各メソッドのために必要があります新しいAsyncTaskを作成すると、コードサイズが大幅に増加します。

私はパラメータとしてメソッドを取得し、それを実行するいくつかの一般的なAsincTaskについて考えましたが、私が知る限り、Javaではメソッドをパラメータとして渡すことは不可能です。

つまり、私は非同期的にメソッドを実行する最もコンパクトな(ただし正しい)方法を探しています。

+0

このため、一般的な非同期タスク方法を使用できます。 Async用の汎用スーパークラスを作成し、doInBackgroundメソッドとonPostExecuteメソッドから2つのメソッドを呼び出すことができます。これらのメソッドは、これらのメソッドをオーバーライドすることによってアクティビティーで使用することができます。 –

答えて

3

HandlerおよびLooper

ほとんどの場合、ハンドラはUIスレッドのLooperにしておき、それを使用してRunnableに投稿してください。たとえば:

Handler h = new Handler(); 
//later to update UI 
h.post(new Runnable(//whatever); 

PS:HandlerLooperは素晴らしいです。そんなに私はremade Java用です。

+0

スレッドとよく似ています。なぜそれが好まれますか? – Misha

+0

内部的には、UIスレッドはルーパをループしています(つまり、ルーパがルーパに追加されるのを待っていますが、見つかったらそれを実行して実行します) 。あなたのアプリケーションでは、通常のスレッドは処理を行い、UIで更新する必要があるものだけがUIスレッドのルーパーに送られます。したがって、プロセス全体が簡素化されます。 – Jatin

0

Commandデザインパターンを使用し、 "コマンド"オブジェクトを実行できる汎用のAsyncTaskを作成した場合は、タスクごとに1つのクラスとそれらをすべて実行する汎用の1つのAsyncTaskが必要です。あなたは、反射やいくつかの事前定義されたインターフェースメソッドを使ってメソッドを実行する一般的な "コマンド"を作ることさえできます。

+0

これは、1つのメソッドを非同期に実行するためのかなりのコードに見えます。各メソッドのCommandを実装するクラスを作成する必要がありますか? – Misha

+0

パターンを使用して、任意のオブジェクトに対して任意のメソッドを実行する「コマンド」を作成することができます。または、それぞれの特定のオブジェクトに固有のものを作成することもできます。または、インタフェースを作成するか(またはRunnableのようなものを使用して)、そのインタフェースに対して実行するコマンドを作成することができます。多分あなたが使うことができる他のパターンがありますが、あなたが望むように想像して得ることができるという点は、それぞれにトレードオフがあります。 – CodeChimp

関連する問題