私はAsyncTaskの初心者で問題があります。 AsyncTaskは、別のクラスの関数を呼び出してDBに情報を保存します。問題は、関数が終了する前にonPostExecuteメソッドが呼び出されていることです。ここに私のコードです:asynctaskの別のクラスのメソッドがアンドロイドで終了するまでの方法
class checkNewReviews2 extends AsyncTask<List<ReviewList.ReviewItem>, Void, Void>{
@Override
protected Void doInBackground(List<ReviewList.ReviewItem>... reviewList) {
int size = reviewList[0].size();
if(size>0) {
for (int i = 0; i < size; i++) {
ReviewList.ReviewItem r = reviewList[0].get(i);
ContentValues c = new ContentValues();
c.put(LentaClass.LentaListEntry.FILM_ID, r.getFilm_id());
c.put(LentaClass.LentaListEntry.USER_ID, r.getUser_id());
c.put(LentaClass.LentaListEntry.REVIEW_TEXT, r.getReview_text());
c.put(LentaClass.LentaListEntry.CREATED_AT, r.getCreated_at());
c.put(LentaClass.LentaListEntry.REVIEW_TYPE, r.getReview_type());
c.put(LentaClass.LentaListEntry.VIEWS, r.getViews());
sqLiteDatabase.insert(LentaClass.LentaListEntry.TABLE_NAME, null, c);
c.clear();
}
FilmHandler filmHandler = new FilmHandler(getContext());
filmHandler.HandleFilms(reviewList[0]);
UserHandler userHandler = new UserHandler(getContext());
userHandler.HandleUsers(reviewList[0]);
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
initiateRecyclerView();
}
}
私はすでにすべての呼び出しをonPreExecuteに入れようとしましたが、結果は変わりません。また、通知として、SQLコード(サイクル)の最初のブロックは、フィルムおよびユーザーハンドラとしてではなく、正常に処理されます。 AsyncTaskが完全に実行された後、InitateRecyclerViewをどのように呼び出すべきですか?
は '問題はonPostExecute方法はおそらくあなたがdoInBackground' workThread –
onPostExecuteだけdoInBackgroundの完了後に実行される他のスレッドの'から使用している私の関数finishes'の前に呼び出していることです。 FilmHandlerとUserhandlerが別々のスレッドに実装されている場合、問題が発生する可能性があります。これを避けるには、代わりに別のスレッドを使用してdoInBackground自体の保存データ全体を完了させます。 –
したがって、私はFilmHandlerとUserHandlerを同じスレッドで実行できますか? –