2012-01-26 10 views
5

AsyncTaskの完了後、私はListの結果が6種類あります。 Listの結果はActivityに返されます。例えば、List<A>,List<B>,List<C>,List<D>,List<E>および最後にList<F>とする。AndroidのAsyncTaskで匿名リストまたはArrayListを返す方法

これは私のAsyncTask次のとおりです。

public class myAsync extends AsyncTask<String, String, List> { 

    private List resultList; 

    @Override 
    protected List doInBackground(String... params) { 
     //params[0] is url 
     //params[1] is type 
     callAPI api = new callAPI(params[0], params[1]); 
     // According to type api decides type of List and generates 
     return api.getJSON(); // returns a List which already parse JSON 
    } 

    @Override 
    protected void onPostExecute(List result) { 
     // Result is here now, may be 6 different List type. 
     this.resultList = result 
    } 

    // returns result 
    public List getResultList() { return this.resultList; } 
} 

私はこのようなAsyncTaskと呼ぶことにします:

myAsync task = new myAsync(); 
task.execute(params); 
List myList = task.getResultList(); // type is uncertain 
Log.d("Tag", Integer.toString(myList.size()); 

あなたが知っている、私は<>タグの間に戻り型(結果を)指摘しなければなりません。 Listの特定のタイプを選択した場合、他のタイプでは機能しません。

実際には、私は既にList<Object>Listタイプのみを返そうとしました。しかし、うまくいきません。

私は使用したくありません6種類Asyncです。 AsyncTaskでこれを解決することは可能ですか?私は匿名のリストが必要かと思います。誰もこれを説明できますか?

+0

あなたは、<無視することができます>、それはあなたに警告、エラーではありません。 – kosa

+0

あなたはこの定義を使うべきです: 'AsyncTask '。そうであれば、戻り値の型は何でしょうか?私はすでに正常なリストとしてすべての型を返しました、NullExceptionエラーが発生しました。 –

+0

ここでstacktraceをポストすると、あなたが得ているNullPointerがどこか別の場所にある可能性があります。 – kosa

答えて

9

まず、リストを取得する順序がではなく、であることを指摘しておきます。私が証明してみましょう:

// Initialize myAsync 
myAsync task = new myAsync(); 

// This will do work for some period of time, this statement DOES NOT 'block' 
// till myAsync completes, it will run it in the background 
task.execute(params); 

// This will return null because by the time you get here, task.execute most 
// likely hasn't finished yet. 
task.getResultList(); 

編集:今、あなたはリスト結果でやりたいものを含めましたことを、ここにあなたがあなたのonPostExecute方法を変更します方法は次のとおりです。

@Override 
protected void onPostExecute(List result) { 
    Log.d(TAG, "The returned list contains " +result.size()+ "elements"); 
    // Do anything else you need to with the returned list here 
} 

ので、要約すると、返されたリスト(サイズの印刷に加えて)の他に何かを行う必要がある場合(例えば、比較、プリントアイテムなど)は、onPostExecuteメソッドで行う必要があります。

+0

申し訳ありませんが、構文エラーです。もちろん、task.getResultList()でなければなりません。今修正されました。そしてあなたが正しいです、それは早いgetResultList()メソッドです。どうすればいいですか? –

+1

@OgulcanOrhanあなたの[前の]質問(http://stackoverflow.com/a/9019395/1101070)で指摘したように、通常、AsyncTaskの 'onPostExecute'メソッドを使用して、必要なものを何でも_doしますリストを使ってdo_する。あなたの質問を編集して、あなたが 'task.getResultList()'であなたの_do_を含むようにしてください。私はあなたに良い答えを与えることができます。 –

+0

'doInBackground'と' onPostExecute'が更新されました。今はっきりしていることを願っています。 –

2

リストの内容(A、B、Cとは何か)に応じて、それらのインターフェースを作成することができます。

したがって、A、B、Cなどがオブジェクトである場合、私たちがListContentInterfaceと呼ぶインターフェイスを作成できます。それぞれの要素はListContentInterfaceを実装する必要があります。あなたはそのリストの最初の要素を取って、それのクラスを確認することで、リストの内容が本当に何であるかをテストすることができた後

List<ListContentInterface>. 

if(element.getClass() == ClassToTestFor.class) ... 
をそれからようなタイプを指摘することができます

オブジェクトに共通のメソッドがある場合は、それらをインターフェイスで指定する必要があります。彼らが共通のメソッドを持っている場合は、オブジェクトのクラスをテストせずに直接リストリストを使用することができます(インターフェイスの定義どおりに行うことができます)。

私はこれがあなたにいくらか理解されることを願っています。インターフェイスや最適なソリューションを使用するのは最適ではないかもしれませんが、問題が解決する可能性があります。

+0

はい、私はこれらの6つの異なるオブジェクトのためのインターフェイスを作ることができるかもしれません。しかし、何が変わるでしょうか?私は次のステップを理解できませんでした。 –

+2

インターフェイスにすべてのアイテムがある場合、そのインターフェイスを実装するオブジェクトを含むリストを作成できます。そうすれば、すべてのオブジェクトに対して同じタイプのリストを使用することができます。その後、異なるアイテムタイプに固有の何かを行う必要がある場合は、それらのアイテム固有のロジックを実行する前に、リストから要素を取り出し、それらがどのクラスであるかをテストすることができます。 –

0

私はこの種の問題をexecute()。get();を使って解決しています。

call from activity 

    ArrayList<String> arraylistitem= new jsonparsing(getActivity()).execute().get(); 

    In async task 

    public class jsonparsing extends AsyncTask<Void, Void, ArrayList<String>> 
    { 
    public jsonparsing(Activity activity) 
     { 
      this.activity = activity; 
      arraylistitem = new ArrayList<String>();   
     } 

     protected ArrayList<String> doInBackground(Void... arg0) 
     { 
       // Do anything else you need to with the returned list here 
      return arraylistitem; 
      } 
    } 
関連する問題