如何修复&#34;实际参数<anonymous onsharedpreferencechangelistener =“”>无法通过方法调用转换转换为上下文&#34;

时间:2016-03-30 18:29:11

标签: java android

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

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

错误发生的位置标记在上方。我再次收到与“背景”相关的错误,这个概念,我仍然无法理解......

我特别感到困惑的是,下面的代码就是调用

alarm.SetAlarm(this);

工作正常。也许问题是因为使用了内部类?

任何想法如何解决这个问题?或修复整个代码?我已经将示例中的代码放在一起,我不确定这是不是很好的android代码...

2 个答案:

答案 0 :(得分:0)

在该特定上下文中this确实引用了OnSharedPreferenceChangeListener,如错误消息中所示。

this替换为AlarmService.this以引用外部服务实例,事情应该有效。

根据您的评论,您还需要初始化onCreate()内的偏好设置。

首先只声明偏好

private SharedPreferences sharedPref;

然后在onCreate()里面做

sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

答案 1 :(得分:0)

在侦听器this内部引用OnSharedPreferenceChangeListener对象,该对象不扩展Context类。您需要将有效的Context对象传递给setAlarm方法 但是,当您在onStartCommand中调用setAlarm时,this代表您的AlarmService对象。

如需进一步参考 - 请阅读Oracle documentation