AsnycTask get()メソッドを使用してバックグラウンドタスクが完了するのを待つことができますが、LoaderManagerコールバックでCursorLoaderとContentProviderを使用している場合はどうすればいいですか?UIスレッドがバックグラウンドスレッドの終了を待つ方法を教えてください。
UIスレッドがバックグラウンドスレッドで返されたデータを待つのを防ぐことはできますか?
AsnycTask get()メソッドを使用してバックグラウンドタスクが完了するのを待つことができますが、LoaderManagerコールバックでCursorLoaderとContentProviderを使用している場合はどうすればいいですか?UIスレッドがバックグラウンドスレッドの終了を待つ方法を教えてください。
UIスレッドがバックグラウンドスレッドで返されたデータを待つのを防ぐことはできますか?
あなたは簡単にバックAsynctask .Thisの呼び出し得るためにあなたのインターフェイスを渡すことができますが、それまでは、応答を待つために、あなたの問題
AsyncTaskの全体のアイデアは、メインスレッドに/から出る方法を提供することです。私はなぜあなたがコールバックインターフェイスを使用するのか分からない。 –
ショーProgressDialogの解を得るための正しい方法で受信されません。あなたの応答が同じクラスまたはアクティビティから受信している場合、インターフェイスのコールバックを使用しないでください。応答がクラスの他のアクティビティから受信した場合は、インターフェイスコールバックを使用してください。
UIThreadで待機すると、 。 blundellは編集の良い点を作った。
コンテンツプロバイダとカーソルローダーを使用して連絡先のリストを要求して、後でリストビューに表示する必要がある現在のプロジェクトの状況がまったく同じです。だからここ
は、あなたが何をすべきかです:
doInBackground()
メソッドの中にカーソルを取得してデータを処理する関数を配置して、List<Object>
オブジェクトが返されるようにします。私の場合、返されるモデル(Contact)オブジェクトです。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
}
}
}
}
ローダーの考え方は、UIスレッドを待機させたり、空の画面を表示したり、ダミーデータやローディングスピナーをデータが得られるまで表示しないようにすることです。 – Blundell
はい、リゾルバでは、AsyncTaskでプロセスをラップする必要があります。 –