如何将共享首选项从服务传递到片段?

时间:2019-03-30 13:54:19

标签: android android-fragments android-service sharedpreferences

我正在尝试通过共享的首选项将数据从Service类传递到Fragment类。

我没有遇到语法错误,但是有一个逻辑错误,因为我没有在StepsFragment中使用所需的更新的步骤计数器来更新文本视图。

我正在StepsService.java中运行一个计步器,并且试图将信息传递给StepsFragment.java

我尝试了以下解决方案:

Access shared preference from a service

Can I get data from shared preferences inside a service?

这是我在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 :(得分:0)

在您的Fragment中,您致电startService(),此后立即阅读SharedPreferences。这行不通。对startService()的调用是异步的。它基本上只是要求Android启动Service。这将在将来的某个时间发生,但绝对不会立即发生。

Service的启动和SharedPreferences的更新将需要一些时间。

Service更新Intent时,您可以让SharedPreferences发送广播Fragment,并且您的ActivityIntent可以注册接收此广播的通知View,并以此作为触发来更新SharedPreferences

或者您可以等待一些时间再检查df.columns = df.columns.str.replace('i', "") header 1.0 header 1.1 header 2.0 header 2.1 0 1 2 3