Как передать общие настройки из сервиса во фрагмент? - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь передать данные через общие настройки из класса Service в класс Fragment.

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

Я запускаю счетчик шагов в StepsService.java и пытаюсь передать информацию в StepsFragment.java.

Я пробовал следующие решения:

Доступ к общим настройкам службы

Можно ли получить данные из общих настроек внутри службы?

Это мой код в StepsService.java

  @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        final long timeInterval = 1000;
        Runnable runnable = new Runnable() {
            public void run() {
                while (true){
                    // ------- code for task to run
                    SharedPreferences.Editor editor = getSharedPreferences("DeviceToken",MODE_PRIVATE).edit();
                    editor.putString("DeviceToken",String.valueOf(stepsCounter));
                    editor.apply();
                    addNotification(String.valueOf(stepsCounter));
                    // ------- ends here
                    try {
                        Thread.sleep(timeInterval);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        Thread thread = new Thread(runnable);
        thread.start();
        return START_NOT_STICKY;
    }

Это мой код в StepsFragment.java

    public void startService(View view) {

        Intent serviceIntent = new Intent(getActivity(),StepsService.class);
        getActivity().startService(serviceIntent);
        SharedPreferences prefs = this.getActivity().getSharedPreferences("DeviceToken", MODE_PRIVATE);
        String deviceToken = prefs.getString("DeviceToken", null);
        tv_steps.setText(deviceToken);
    }

1 Ответ

0 голосов
/ 02 апреля 2019

В вашем Fragment вы звоните startService(), а сразу после этого вы читаете SharedPreferences. Это не сработает. Вызов startService() является асинхронным. В основном он просто просит, чтобы Android запустил Service. Это произойдет в будущем, но определенно НЕ сразу.

Для запуска Service и обновления SharedPreferences потребуется некоторое время.

Вы можете сделать так, чтобы Service отправлял широковещательную рассылку Intent при обновлении SharedPreferences, а Fragment или Activity мог зарегистрироваться, чтобы получать уведомления об этой широковещательной передаче Intent, и использовать ее в качестве триггера для обновить View.

Или вы можете просто подождать некоторое время, прежде чем проверять SharedPreferences.

...