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);