getSharedPreferences в виджете приложения не возвращает строковые данные из Firebase - PullRequest
0 голосов
/ 30 марта 2020

У меня есть виджет приложения с этим кодом:

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

final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.my_widget);

Intent intent = new Intent(context, ClickIntentService.class);
intent.setAction(ClickIntentService.ACTION_CLICK);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

views.setOnClickPendingIntent(R.id.textViewClicks, pendingIntent);

int clicks = context.getSharedPreferences("sp", MODE_PRIVATE).getInt("clicks", 0);
String user_name = context.getSharedPreferences("sp", MODE_PRIVATE).getString("user_name", null);

views.setTextViewText(R.id.textViewClicks, String.valueOf(clicks));
views.setTextViewText(R.id.textViewUserName, user_name);

appWidgetManager.updateAppWidget(appWidgetId, views);

}

У меня также есть сервис для того, что выполняет действие ACTION_CLICK:

@Override
protected void onHandleIntent(Intent intent) {
    if (intent != null) {
        final String action = intent.getAction();

        if (ACTION_CLICK.equals(action)) {
            actionClick();
        }
        if (ACTION_UPDATE.equals(action)) {
            actionUpdate();
        }
    }
}

private void actionClick() {
    int clicks = getSharedPreferences("sp", MODE_PRIVATE).getInt("clicks", 0);
    clicks++;

    getSharedPreferences("sp", MODE_PRIVATE)
            .edit()
            .putInt("clicks", clicks)
            .putString("user_name", "Example")
            .apply();

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
    int[] widgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, MyWidget.class));
    for (int appWidgetId : widgetIds) {
        MyWidget.updateAppWidget(getApplicationContext(), appWidgetManager, appWidgetId);
    }
}

Работает нормально, даже если "Пример" заменяется простой строковой переменной.

String user_name = "Example";
...some code...
.putString("user_name", user_name)

Но если переменная user_name содержит строковую форму данных Firebase, она не будет работать правильно. Этот код возвращает ноль:

String user_name = context.getSharedPreferences("sp", MODE_PRIVATE).getString("user_name", null);

Это код, который получает имя_пользователя из Firebase:

        final DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Users").child("JMtk-T2AZ-LJY8").child("name");

    reference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            String user_name =  String.valueOf(dataSnapshot.getValue());
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }

Когда я проверяю уведомлением (отправлено службой), содержит ли имя_пользователя правильные данные из Firebase все нормально, но код виджета возвращает ноль.

Кто-нибудь знает решение?

...