【发布时间】:2018-01-06 13:27:34
【问题描述】:
我是 AsyncTask 的新手,我遇到了问题。 我有 AsyncTask,它通过调用另一个类的函数将信息保存在 DB 中。问题是 onPostExecute 方法在我的函数完成之前调用;这是我的代码:
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 代码(循环)已成功处理,而不是作为 Film 和 User 处理程序。 AsyncTask 完全执行后,我应该如何调用initialRecyclerView?
【问题讨论】:
-
The problem is that onPostExecute method is calling before my function finishes可能您正在使用来自doInBackgroundworkThread 的其他线程 -
onPostExecute 将仅在 doInBackground 完成后执行。如果 FilmHandler 和 Userhandler 在单独的线程上实现,可能会导致问题。因此为避免这种情况,请不要使用另一个线程将数据保存在 DB 中,而是在 doInBackground 本身中完成整个保存数据。
-
那么我怎样才能在同一个线程中运行 FilmHandler 和 UserHandler 呢?
标签: java android sqlite android-asynctask