Android - Как получить доступ к данным из базы данных комнат в виджет стека - PullRequest
0 голосов
/ 21 сентября 2019

Я только что узнал об Android, и здесь у меня есть домашнее задание.Я пытался создать виджет стека, который обращается к данным из комнаты базы данных, здесь я пытаюсь получить к нему доступ, но данные не отображаются, я запутался в решении и до сих пор не понимаю

private Context context;
private List<MovieEntity> list = new ArrayList<>();

public StackRemoteViewsFactory(Context context) {
    this.context = context;
}

@Override
public void onCreate() {

}

@Override
public void onDataSetChanged() {
    new AsyncTask<Context, Void, List<MovieEntity>>() {

        @Override
        protected List<MovieEntity> doInBackground(Context... contexts) {
            AppDatabase database = AppDatabase.getInstance(context);
            list = database.favoriteDao().getMovies();

            return list;
        }

        @Override
        protected void onPostExecute(List<MovieEntity> movieEntities) {
            super.onPostExecute(movieEntities);
        }

    }.execute(context);
}

@Override
public RemoteViews getViewAt(int position) {
    RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.item_widget);

    for (MovieEntity movieEntity : list) {
        Bitmap bmp = null;
        try {
            bmp = Glide.with(context)
                    .asBitmap()
                    .load("https://image.tmdb.org/t/p/w300_and_h450_bestv2" + movieEntity.getPosterPath())
                    .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get();

        } catch (Exception e) {
            Log.d("ERROR", "error");
        }


        rv.setTextViewText(R.id.txt_item_title, movieEntity.getTitle());
        rv.setImageViewBitmap(R.id.image_item_poster, bmp);
    }
    return rv;

}

@Override
public int getViewTypeCount() {
    return 1;
}

1 Ответ

1 голос
/ 21 сентября 2019

Проблема в том, что вы не используете список movieEntities в onPostExecute()

. Способ работы AsyncTask заключается в doInBackground() для выполнения фактической фоновой работы (доступ к сети, доступ к базе данных,и т.д...).

Затем все, что вы возвращаете из этого метода, передается в onPostExecute(), который работает в основном потоке и где вы должны затем использовать его.

...