2016-11-04 3 views
0

非同期タスクの結果を得るために多くの質問がありましたが、いずれも問題を解決しませんでした。私がしたいことは、MyClassオブジェクトの非同期タスク配列から取得してUIで使用することですが、異なる状況ではUIが異なります。ときには、私の配列でrecyclerviewを塗りつぶすことがあります。時には、配列で無限のタブ付きアクティビティを塗りつぶすこともあります。これは、onPostExecute()で処理するために、私のUI要素をAsyncタスクに渡すことができないことを意味します。非同期タスクから得たい結果は、MyClassオブジェクトの配列であり、別の状況では別の方法で動作します。そして、一つ重要なことは、(それがまだ実行中だ場合、私はとUIを埋めるためにデータがないので)私はAsyncTaskの実行後に私のUIを埋めなければならないので、私は単純に最ものでasynctaskの結果を取得して処理する

MyClass[] result = new MyAsyncTask().execute().getResult() 
MyUI.fillWith(result) 

のようなものを書くことができないということですおそらく私はNPEを得るでしょう。

私の結果をMyClassオブジェクトの配列として取得し、その結果を取得した後でUIを埋め込むにはどうすればよいですか?(UIスレッドでは、asynctaskがすべての作業を行い、私のデータでUIを埋めることができます。もちろん、私はUIスレッドをブロックしたくありません)?

取り扱いUI onPostExecute()で、前に書いた理由のために私の問題は解決しません。インターフェイスでAsyncTaskをカバーしても、私が必要とするもののように見えません。そして私はAsyncTaskのためのユニークなトークンを持つ解決策を見ましたが、私はそれがどのように動作するかを知りませんでした。

+0

しかし、それは、それが動作するだけでどのようなので、あなたがonPostExecuteでUIスレッドを処理する必要があります。 AsyncTaskは使用しないでください。他のネットワーキングライブラリを考慮しましたか? –

+1

そのトップアンサーは本質的にあなたの後ろのものです。レスポンスインターフェイスの 'String output'を' MyClass [] output'に置き換えて、 –

+0

@ cricket_007と設定する必要があります。しかし、これは複雑な解決策のようです。それは私が理解するように、これは共通の問題であるので、それは奇妙です。 – Leopik

答えて

3

むしろAsyncTaskに直接あなたのUI要素を渡すよりも、タスクが完了したら実行するアクションを表すインターフェイスを作成します。

public interface MyTaskHandler { 
    void onComplete(MyClass[] results); 
} 

そして、あなたのタスクは、このインターフェイスを受け入れ、onPostExecuteでそれを呼び出すます

public class MyTask extends AsyncTask<..., ..., MyClass> { 
    private MyTaskHandler myTaskHandler; 

    public MyTask(MyTaskHandler myTaskHandler) { 
    this.myTaskHandler = myTaskHandler; 
    } 

    @Override 
    public void onPostExecute(MyClass[] results) { 
    myTaskHandler.onComplete(results); 
    } 
} 

(実際の実装では、あなたのハンドラが生成されますので、あなたが望むで行うのと同じように、あなたの活動が破壊されたときにWeakReferencesを使用するか、参照をゼロにする必要がありますいくつかの参照を持っていますビュー)

次に、あなたが何をしたいのかに基づいてMyTaskHandlerの異なる実装を渡すことができます。

public class MyActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    new MyAsyncTask(new MyTaskHandler() { 
     @Override 
     public void onComplete(MyClass[] results) { 
     // load into list view 
     } 
    }).execute(); 

    new MyAsyncTask(new MyTaskHandler() { 
     @Override 
     public void onComplete(MyClass[] results) { 
     // load into tabs 
     } 
    }).execute(); 
    } 
} 
関連する問題