Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 共享活动和服务之间的引用_Java_Android - Fatal编程技术网

Java 共享活动和服务之间的引用

Java 共享活动和服务之间的引用,java,android,Java,Android,我想在Android上做一个步进计数器,类型为_step _counter, 键入\u步骤\u计数器将在重新引导设备时重置。因此我应该保留这些步骤。我决定使用SharedReference来保留它。 项目结构如下: 在MainActivity.java中 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text

我想在Android上做一个步进计数器,类型为_step _counter, 键入\u步骤\u计数器将在重新引导设备时重置。因此我应该保留这些步骤。我决定使用SharedReference来保留它。 项目结构如下:

在MainActivity.java中

创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text\u step=(TextView)findViewById(R.id.main\u text\u step);
delayHandler=新处理程序(此);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
SharedReferences.Editor Editor=getSharedReferences(“DateStep”,MODE_PRIVATE).edit();

}
您需要在
onCreate
外部声明
编辑器,以使其对其他方法可见,因为当前声明将其范围限制为仅在
onCreate
方法内部,简而言之,它是一个
本地
引用变量

  SharedPreferences.Editor editor; 
  // ^^^^^^^^^^  declare it outside

  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text_step = (TextView) findViewById(R.id.main_text_step);
        delayHandler = new Handler(this);
        Toolbar toolbar=(Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        editor=getSharedPreferences("DateStep",MODE_PRIVATE).edit();
        // initialize editor
    }
要在其他类中使用
编辑器
,请按上图所示声明并初始化它,同时使用相同的文件名
DateStep
将数据保存在该文件中

在服务类中,
覆盖
服务中的
,并应用相同的方法

SharedPreferences.Editor editor; 
// ^^^^^^^^^^  declare it outside

@Override
public void onCreate() {
    super.onCreate();
    editor=getSharedPreferences("DateStep",MODE_PRIVATE).edit();
        // initialize editor
}

您需要在
onCreate
外部声明
编辑器,以使其对其他方法可见,因为当前声明将其范围限制为仅在
onCreate
方法内部,简而言之,它是一个
局部
引用变量

  SharedPreferences.Editor editor; 
  // ^^^^^^^^^^  declare it outside

  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text_step = (TextView) findViewById(R.id.main_text_step);
        delayHandler = new Handler(this);
        Toolbar toolbar=(Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        editor=getSharedPreferences("DateStep",MODE_PRIVATE).edit();
        // initialize editor
    }
要在其他类中使用
编辑器
,请按上图所示声明并初始化它,同时使用相同的文件名
DateStep
将数据保存在该文件中

在服务类中,
覆盖
服务中的
,并应用相同的方法

SharedPreferences.Editor editor; 
// ^^^^^^^^^^  declare it outside

@Override
public void onCreate() {
    super.onCreate();
    editor=getSharedPreferences("DateStep",MODE_PRIVATE).edit();
        // initialize editor
}

您需要提交更改

editor.putInt("step",StepDetector.CURRENT_STEP);
editor.putString("date",current_Date);
editor.apply(); // <-- Save the data in the Shared Preferences.
编辑
您需要提交更改

editor.putInt("step",StepDetector.CURRENT_STEP);
editor.putString("date",current_Date);
editor.apply(); // <-- Save the data in the Shared Preferences.
编辑
我会使用一个接口来交流活动和服务:它使代码更干净,更易于阅读和测试。如果您从未使用过它们,可能会有点困惑,但请花一分钟时间理解代码:

ServiceCallback.java

public interface ServiceCallback {
    void updateStepValue(int value, String date);
}
StepService.java

public class StepService extends Service {
   ServiceCallback mCallback;

   public void bindCallback(ServiceCallback callback) {
       mCallback = callback;
   }

   public void unbindCallback() { 
       mCallback = null; 
   }

   // Somewhere in your code, call callback method to send data to Activity
   ...
   mCallback.updateStepValue(5, "15-07-2017");
}
Activity.java

public class Activity implements ServiceCallback {
    SharedPreferences.Editor editor;
    StepService service;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        editor = context.getSharedPreferences("preferences_key", Context.MODE_PRIVATE).edit();
        // Once your service is running and assigned to service variable
        // bind activity to it to listen service callbacks
        service.bindCallback(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        service.unbindCallback();
    }

    @Override
    void updateStepValue(int value, String date) {
         editor.putInt("step",value);
         editor.putString("date",date);
         editor.apply();
    }
}

我会使用一个接口来交流活动和服务:它使代码更干净,更易于阅读和测试。如果您从未使用过它们,可能会有点困惑,但请花一分钟时间理解代码:

ServiceCallback.java

public interface ServiceCallback {
    void updateStepValue(int value, String date);
}
StepService.java

public class StepService extends Service {
   ServiceCallback mCallback;

   public void bindCallback(ServiceCallback callback) {
       mCallback = callback;
   }

   public void unbindCallback() { 
       mCallback = null; 
   }

   // Somewhere in your code, call callback method to send data to Activity
   ...
   mCallback.updateStepValue(5, "15-07-2017");
}
Activity.java

public class Activity implements ServiceCallback {
    SharedPreferences.Editor editor;
    StepService service;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        editor = context.getSharedPreferences("preferences_key", Context.MODE_PRIVATE).edit();
        // Once your service is running and assigned to service variable
        // bind activity to it to listen service callbacks
        service.bindCallback(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        service.unbindCallback();
    }

    @Override
    void updateStepValue(int value, String date) {
         editor.putInt("step",value);
         editor.putString("date",date);
         editor.apply();
    }
}


您可能应该显示更多的实际问题代码,以便我们有更多的上下文。另外,不要对java代码使用代码段。只需使用代码块您可能应该显示更多实际问题代码,这样我们就有了更多的上下文。另外,不要对java代码使用代码段。只要使用代码块当我按照你告诉我的那样更改时,同样的错误也会发生。Service.java仍然无法识别编辑器。这不是在其他方法中使用它的问题。问题似乎在于它没有在不同的类中声明您必须在不同的类中声明您的
编辑器
,如上图所示,或者您可以创建一个实用程序类,它使用上下文将传递的数据保存到首选项,它不需要(也不应该)在
onCreate()之外声明
如果这是该类中使用编辑器的唯一位置。编辑器是否可以在service.java中声明而不是在活动中?当我按照您的指示进行更改时,同样的错误也会发生。service.java仍然无法识别编辑器。这不是在其他方法中使用它的问题。问题似乎在于它没有在不同的类中声明您必须在不同的类中声明您的
编辑器
,如上图所示,或者您可以创建一个实用程序类,它使用上下文将传递的数据保存到首选项,它不需要(也不应该)在
onCreate()之外声明
如果这是该类中使用的唯一位置。编辑器可以在service.java中声明而不是在activity中声明吗?问题是service.java无法读取mainActivity.java中定义的变量编辑器。正是因为它是在活动中定义的。只需获取编辑器的另一个实例。我已经更新了我的答案上面所有我将使用的编辑器都在服务中,包括put和get。所以我只能在服务中声明它吗?如果您只在服务中使用它,那么,是的,只需声明、初始化并在其中使用它,您就可以在服务中获取应用程序上下文(
getApplicationContext()
)。然后,因为共享首选项可以从应用程序中的任何位置访问,所以您可以检索数据,问题是service.java无法读取mainActivity.java中定义的变量编辑器。正是因为它是在活动中定义的。只需获取编辑器的另一个实例。我已经更新了我的答案上面所有我将使用的编辑器都在服务中,包括put和get。所以我只能在服务中声明它吗?如果您只在服务中使用它,那么,是的,只需声明、初始化并在其中使用它,您就可以在服务中获取应用程序上下文(
getApplicationContext()
)。然后,由于共享首选项可以从应用程序中的任何位置访问,因此您可以检索数据。谢谢。这肯定是一种更好的方法。这是否意味着如果不再使用活动,您会在服务事件中保留活动的实例?它不会产生泄漏?就是这样:您需要调用一个方法来删除活动对
onDestroy()
onResume()
方法的引用,如下所示:
public void unbindCallback(){mCallback=null;}
谢谢。这肯定是一种更好的方法。这是否意味着如果不再使用活动,您会在服务活动中保留活动实例?它不会产生泄漏?就是这样:您需要调用一个方法来删除活动对
onDestroy()
onResume()
方法的引用,如下所示:
public void unbindCallback(){mCallback=null;}