Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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 “如何修复”;实际论点<;匿名OnSharedPreferenceChangeListener>;无法通过方法调用转换转换为上下文;_Java_Android - Fatal编程技术网

Java “如何修复”;实际论点<;匿名OnSharedPreferenceChangeListener>;无法通过方法调用转换转换为上下文;

Java “如何修复”;实际论点<;匿名OnSharedPreferenceChangeListener>;无法通过方法调用转换转换为上下文;,java,android,Java,Android,我有以下源于Service的代码,我想在后台将其作为服务运行。在这个类中,我使用一个SharedPreferences.OnSharedPreferenceChangeListener类来检查共享首选项是否发生了更改,以便重新初始化一个BroadcastReceiver,使其以某个定义的时间间隔(如每6小时)运行。但是,例如,当我将主要活动中的显式共享首选项更改为3小时时,我需要代码在3小时内运行(而不是6小时)。以下是服务的代码: public class AlarmService exten

我有以下源于
Service
的代码,我想在后台将其作为服务运行。在这个类中,我使用一个
SharedPreferences.OnSharedPreferenceChangeListener
类来检查共享首选项是否发生了更改,以便重新初始化一个
BroadcastReceiver
,使其以某个定义的时间间隔(如每6小时)运行。但是,例如,当我将主要活动中的显式共享首选项更改为3小时时,我需要代码在3小时内运行(而不是6小时)。以下是
服务的代码

public class AlarmService extends Service
{
    public Alarm alarm = new Alarm();
    public SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

    public void onCreate()
    {
        super.onCreate();
        SharedPreferences.OnSharedPreferenceChangeListener spChanged = new
            SharedPreferences.OnSharedPreferenceChangeListener() {
                @Override
                public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
                                                      String key) {                       
                    // reinitialize the alarm
                    alarm.SetAlarm(this); // ERROR HERE
                }
        };
        //SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
        sharedPref.registerOnSharedPreferenceChangeListener(spChanged);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        Log.d("!~!", "Service started.");
        alarm.SetAlarm(this);
        return START_STICKY;
    }


    @Override
    public IBinder onBind(Intent intent)
    {
        return null;
    }
}
方法
SetAlarm
在从
BroadcastReceiver
派生的类中定义,实现如下:

 public void SetAlarm(Context context)
    {
        // get the update cylce from the prefences
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
        int updateInterval = Integer.parseInt(sharedPref.getString("updateInterval", "24"));
        Log.d(LOGHEAD, String.format("Alarm set to update every %d hours.", updateInterval));


        AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, Alarm.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * updateInterval, pi); // Millisec * Second * Minute
    }
但是当我编译代码时,我得到以下错误:

Error:(33, 26) error: method SetAlarm in class Alarm cannot be applied to given types;
required: Context
found: <anonymous OnSharedPreferenceChangeListener>
reason: actual argument <anonymous OnSharedPreferenceChangeListener> cannot be converted to Context by method invocation conversion
工作正常。也许问题是因为使用了内部类


有没有办法解决这个问题?或者修复整个代码?我已经将示例中的代码放在一起,我不确定这是否是好的android代码…

在特定上下文中
指的是错误消息中显示的
OnSharedPreferenceChangeListener

替换为
AlarmService。此
引用外部服务实例,一切正常

根据您的评论,您还需要初始化
onCreate()
中的首选项

首先只声明首选项

private SharedPreferences sharedPref;
然后在
onCreate()中执行

sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

在侦听器内部,此
引用不扩展
上下文
类的
OnSharedPreferenceChangeListener
对象。您需要将有效的
Context
对象传递给
setAlarm
方法。
但是,当您在onstart命令中调用setAlarm时,
表示您的AlarmService对象


进一步参考-阅读

更新的答案以解决您的其他问题。我明白了。您可能会遇到的另一个需要注意的问题是,在共享首选项ChangeListener上注册
而不保留对它的强引用的行为。
sharedPref = PreferenceManager.getDefaultSharedPreferences(this);