2012-03-17 14 views
0

AsyncTaskを使用して2つの異なるスレッドで2つの長期実行クエリを実行することは可能ですか(ベストプラクティス)ですか?AsyncTaskは2つの異なるスレッドを実行していますか?

私のシナリオでは、このようなものされています

1) Loading data from HttpGet (once it load then load into the listview) 
2) Parsing the data into Listview 

現在、私は#1を行うにはdoInBackgroundを実行し、onPostExecuteに応答は大丈夫ですが、私は思っています#2 をやっていること方法があります私はそれをより速くすることができますか?

私は2つの異なるスレッドを実行していますが、質問があれば、onPostExecuteから別のスレッド(AsyncTask)を実行できるようになりますか?

おかげで、

+1

なぜなら、同じ 'AsyncTask'を使用して' doInBackground'から 'ListView'の最終データだけを返すのはなぜですか? – Luksprog

+0

はい私はしようとしましたが、エラーメッセージが表示され、2つのスレッドを実行できないというメッセージが表示されます。 –

答えて

0

私はそれは、どんな速くなり、あなたはそれについて考える場合の手順はちょっとシリアルであるため、あなたはリストビュー内のデータを解析し、次に示すことによって、その後、最初のデータ取得が必要かどうかわかりません。

したがって、AsyncTaskはANRの回避に役立ちます。別のAsyncTaskでいつでも解析することができます。しかし、それはすべてのサイクルをより速くすることはありません。

0

なぜ別のスレッドを作成する必要があるのか​​混乱します。

doinBackground(プロセス)は、postExecuteスレッド(UI)とは別のスレッドです。したがって、ステップ1を実行すると、自動的にステップ2の別のスレッドになります。

これが役立ちます。コメントだけで2つのスレッドを実行する方法を知りたければ、それを説明することができます。

しかし、あなたの場合のために、asynctaskは、基本的にはすでにあなたのためにそれを行っている:D

は、このクラスを拡張し、この内、あなたのスレッドを配置してみます。試してみる価値。

import android.os.AsyncTask; 

public class ThreadWorker extends AsyncTask<Void, Void, Boolean> { 

ThreadWorker.Method CURRENT_METHOD; 

enum Method{ 
    PREEXCEUTE, 
    BACKGROUND, 
    POSTEXECUTE, 
    PROGRESSUPDATE,  
} 
@Override 
protected void onPreExecute() { 
    try{ 
     CURRENT_METHOD = Method.PREEXCEUTE; 
     preExecute(); 
    }catch(Exception e){ 
     onError(Method.PREEXCEUTE); 
    } 
} 
@Override 
protected Boolean doInBackground(Void... params) { 
    try{ 
     CURRENT_METHOD = Method.BACKGROUND; 
     background(); 
    }catch(Exception e){ 
     onError(Method.BACKGROUND); 
    } 
    return true; 
} 
@Override 
protected void onProgressUpdate(Void... v){ 
    try { 
     CURRENT_METHOD = Method.PROGRESSUPDATE; 
     onProgressUpdate(); 
    } catch (Exception e) { 
     onError(Method.PROGRESSUPDATE); 
    }  
} 
protected void onPostExecute(Boolean result) { 
    try{ 
     CURRENT_METHOD = Method.POSTEXECUTE; 
     postExecute(); 
    }catch(Exception e){ 
     onError(Method.POSTEXECUTE); 
    } 
} 
public ThreadWorker.Method getCurrentThread(){ 
    return CURRENT_METHOD; 
} 
public void preExecute() throws Exception{}; 
public void background() throws Exception{}; 
public void postExecute() throws Exception{}; 
public void onProgressUpdate() throws Exception{}; 
public void onError(Method m){}; 
    } 

私は正常にあなたがAsyncTaskを起動すると、あなたのアプリケーション内で実行される2つのスレッドを持って、このクラス

+0

別のスレッドで2つ以上のジョブを実行するにはどうすればよいですか? –

+0

私は自分の答えを編集しました – bluejamesbond

+0

あなたのコードを理解しているかどうかわかりませんが、enumの値を渡すことを除いて...あなたのコードの目的は何ですか? –

0

の内側にそれをやっています。 UIスレッドとAsyncTaskスレッド。

1つのAsyncTaskで長時間実行される操作を実行します。データの取得/解析はdoInBackground内で行う必要があります。 onPostExceuteは、ListViewを更新する唯一の場所であるUIスレッドから呼び出されます。

onPostExecuteから別のAsyncTaskを開始できますが、doBackgroundの終了後に呼び出されます。

2つのタスクを並列に実行するには、UIスレッドから同時に2つのAsyncTaskを呼び出します。

関連する問題