2016-12-31 6 views
2

AsnycTask get()メソッドを使用してバックグラウンドタスクが完了するのを待つことができますが、LoaderManagerコールバックでCursorLoaderとContentProviderを使用している場合はどうすればいいですか?UIスレッドがバックグラウンドスレッドの終了を待つ方法を教えてください。

UIスレッドがバックグラウンドスレッドで返されたデータを待つのを防ぐことはできますか?

+1

ローダーの考え方は、UIスレッドを待機させたり、空の画面を表示したり、ダミーデータやローディングスピナーをデータが得られるまで表示しないようにすることです。 – Blundell

+0

はい、リゾルバでは、AsyncTaskでプロセスをラップする必要があります。 –

答えて

0

あなたは簡単にバックAsynctask .Thisの呼び出し得るためにあなたのインターフェイスを渡すことができますが、それまでは、応答を待つために、あなたの問題

+0

AsyncTaskの全体のアイデアは、メインスレッドに/から出る方法を提供することです。私はなぜあなたがコールバックインターフェイスを使用するのか分からない。 –

0

ショーProgressDialogの解を得るための正しい方法で受信されません。あなたの応答が同じクラスまたはアクティビティから受信している場合、インターフェイスのコールバックを使用しないでください。応答がクラスの他のアクティビティから受信した場合は、インターフェイスコールバックを使用してください。

0

UIThreadで待機すると、 。 blundellは編集の良い点を作った。

0

コンテンツプロバイダとカーソルローダーを使用して連絡先のリストを要求して、後でリストビューに表示する必要がある現在のプロジェクトの状況がまったく同じです。だからここ

は、あなたが何をすべきかです:

  • 静的内部クラスとして非同期タスクを使用して、アクティビティ/フラグメントをwhithinからコンテンツプロバイダーへの非同期呼び出しを行います。
  • AsyncTask doInBackground()メソッドの中にカーソルを取得してデータを処理する関数を配置して、List<Object>オブジェクトが返されるようにします。私の場合、返されるモデル(Contact)オブジェクトです。
  • AsyncTaskのonPostExecute()メソッドの中では、使用しているビューにretreivedデータリストを渡すだけです(もう一度私のケースではList<Contact>です)、mainThreadがデータを受け取っている場所で、準備ができたらデータを処理する必要があります。

AsyncTask彼らはバックグラウンド別のスレッドにMainThreadから渡すデータを処理し、その後MainThreadにバックグラウンドスレッドから戻ってデータを出荷するために、文字列の構造を持っているとして、あなたの人生ははるかに容易になります。

であなたのコードは次のようになります:

public class MainActivity extends Activity { 
    private AsyncTask mTask; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // 
     ...... 
     //Call the AsyncTask and pass your Data 
     mTask = new Task(this); 
     mTask.execute(); 
    } 

    private static class Task extends AsyncTask<Void, Void, List<Object> { 
     private WeakReference<Contex> mContextRef; 
     public Task(Context context) { 
      mContextRef = new WeakReference<>(context); 
      //later when you need your context just use the 'get()' method. like : mContextRef.get() (this will return a Context Object. 
     } 

     @Override 
     protected void onPreExecute() { 
      // show progress Dialog 
      //this method is processed in the MainThread, though it can prepare data from the background thread. 
     } 

     @Override 
     protected List<Object> doInBackground(Void ... params) { 
      List<Object> mList = new ArrayList<>(); 
      //Call your content provider here and gather the cursor and process your data.. 
      //return the list of object your want to show on the MainThread. 
      return mList; 
     } 

     @Override 
     protected Void onPostExecute(List<Object> list) { 
      if(list.size() > 0) { 
      //do your stuff : i.e populate a listView 
      } 
     } 
    } 
} 
関連する問題