Виджет не загружает данные из базы данных (номер) - PullRequest
0 голосов
/ 25 апреля 2019

Мое приложение имеет виджет, который отображает список, а над списком также отображается заголовок этого списка. Все необходимые данные хранятся в базе данных Room. Мне удалось загрузить данные списка через RemoteViews, но я не могу найти способ загрузить заголовок над списком. Может кто знает решение?

То, что я пробовал до сих пор: в своем классе AppWidgetProvider я пытался загрузить данные через прямой доступ через базу данных и daO, который выдает «IllegalStateException: не удается получить доступ к базе данных в главном потоке». Интересный факт: в pre-AndroidX это работало как-то.

Далее я попытался использовать оба, AsyncTask и AppExecutors (см. Код ниже) в методе виджета onUpdate (). Оба закончились одним и тем же результатом: загрузка идет слишком медленно, а заголовок не заполняется и поэтому остается пустым.

public class FavoriteWidget extends AppWidgetProvider {

    public static final String LOG_TAG = FavoriteWidget.class.getSimpleName();

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {

        AppDatabase db = AppDatabase.getsInstance(context);

        Intent serviceIntent = new Intent(context, FavoriteWidgetService.class);
        serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.favorite_widget);
        AppExecutors.getInstance().diskIO().execute(new Runnable() {
            @Override
            public void run() {
                String favName = db.dataDao().getFavorite().getName();
                Log.d(LOG_TAG, "Fetching the favorite name from db: " + favName);
                views.setTextViewText(R.id.appwidget_text, favName);
            }
        });
        views.setRemoteAdapter(R.id.widget_list, serviceIntent);
        Log.d(LOG_TAG, "Setting the ListView");
        views.setEmptyView(R.id.widget_list, R.id.empty_view);

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int appWidgetId : appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

В журнале сначала должно быть указано, что favName выбрано, а затем должен быть установлен ListView, но на самом деле все наоборот, так как загрузка занимает слишком много времени. Есть ли способ ускорить загрузку или сделать это другим способом (все еще используя данные из базы данных)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...