2016-03-30 17 views
0

Arka planda hizmet olarak çalışmak istediğiniz Service türetilmiş aşağıdaki kod var. Bu sınıfta, paylaşılan bir tercihin değişip değişmediğini kontrol etmek için SharedPreferences.OnSharedPreferenceChangeListener sınıfını kullanıyorum, BroadcastReceiver tanımlanmış zaman aralıklarında (her 6 saatte bir) çalıştırılacak. Ancak, ana etkinliğimde açıkça paylaşılan tercihi 3 saate değiştirdiğimde, kodun 3 saat içinde çalıştırılmasına ihtiyacım var (6 saat yerine)."Gerçek bağımsız değişken <anonim OnSharedPreferenceChangeListener> yöntemi, yöntem çağırma dönüşümü ile Bağlam dönüştürülemez"

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 
    } 

Ama kod derleme, aşağıdaki elde:

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

SetAlarmBroadcastReceiver türetilmiş bir sınıf de tanımlandığı gibi uygulanan yöntem şu şekildedir: Burada Service kodudur hata:

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 

Hatanın gerçekleştiği yer yukarıda işaretlenmiştir. Bir kez daha, hala anlamak için 'bağlam', bir kavramla ilgili bir hata başarısız am olsun ...

Özellikle gerçeği ile şaşkın, çağrı kodu aşağıda o detayli

alarm.SetAlarm(this); 

iyi çalışıyor. Belki de sorun bir iç sınıfın kullanımı yüzünden mi?

Bunu nasıl düzeltebilirim? Ya da bütün kodu düzeltmek mi? Örnek kod koydum ve bu iyi bir android kodu olup olmadığından emin değilim ...

cevap

0

Bu bağlamda , hata iletisinde gösterildiği gibi OnSharedPreferenceChangeListener başvuruyor.

dış hizmet örneğini referans AlarmService.this ile this değiştirin ve işler çalışması gerekir. Size dayanarak

ayrıca onCreate() içinde tercihlerini ilklendirmelisiniz yorum yapın.

İlk yalnızca tercihleri ​​

private SharedPreferences sharedPref; 

ve sonra onCreate()this Context sınıfını kapsamaz OnSharedPreferenceChangeListener nesneye başvuran bir dinleyici İçinde

sharedPref = PreferenceManager.getDefaultSharedPreferences(this); 
+0

de diğer sorunu gidermek cevabını Güncelleme okuyun. –

+0

aslında küresel bir sharedPref gerekmez, ama emin ... Anlıyorum – Alex

+0

doğru bir fikrim yok. Ayrıca bir şey haline aday olabileceğini farkında olmak açıklanan davranıştır [buradan] (http: // stackoverflow.com/a/3104265/1435985) bir "OnSharedPreferenceChangeListener" öğesini güçlü bir başvuru kaynağı olmadan kaydetme hakkında. –

0

yapmak beyan ederim. Geçerli bir Context nesnesini setAlarm yönteminize iletmeniz gerekir. Eğer onStartCommand içinde setAlarm çağırdığınızda
Ancak, this senin AlarmService nesneyi temsil eder.

ek bir kaynak olarak - Oracle documentation

İlgili konular