2017-03-22 3 views
2

Mein Ziel ist es, einen Hintergrunddienst zu haben, der zweimal täglich eine ziemlich große Datenmenge aktualisiert (~ 5min Aktualisierung, möglicherweise mehr).Context ist im Service-Konstruktor null?

So habe ich eine GcmTaskService, die diesen Dienst starten:

public class SyncOfflineCoursesService extends Service { 

    private final IBinder mBinder = new MonBinder(); 
    private final SharedPreferenceManagerToReplace sharedPreferenceManager; 

    public SyncOfflineCoursesService() { 

     sharedPreferenceManager = new SharedPreferenceManagerToReplace(this); //crash on this line 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    ... 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return mBinder; 
    } 

    public class MonBinder extends Binder { 
     SyncOfflineCoursesService getService() { 
      return SyncOfflineCoursesService.this; 
     } 
    } 

} 

SharedPreferenceManagerToReplace:

public class SharedPreferenceManagerToReplace { 
    private final SharedPreferences prefs; 

    public SharedPreferenceManagerToReplace(Context context) { 
     this.prefs = PreferenceManager.getDefaultSharedPreferences(context);//crash here 
    } 
} 

, aber es scheint, dass diese Null ist, wenn ich instanziieren SharedPreferenceManager

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 

Das ist, wie Ich habe beide meiner Dienste in meinem Manifest erklärt:

<service 
    android:name=".service.offline.SyncOfflineCoursesService" 
    android:exported="false" /> 

<service 
    android:name=".service.offline.SyncOfflineContentService" 
    android:exported="true" 
    android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"> 

    <intent-filter> 
     <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY" /> 
    </intent-filter> 
</service> 

Hätten Sie eine Idee?

Danke!

+0

Verwenden Sie Application Level Kontext für diese –

+1

Ihr 'Service' sollte nicht wirklich einen Konstruktor haben. Verschieben Sie diese Initialisierung in eine ihrer Lebenszyklusmethoden, wie 'onCreate()' oder 'onStartCommand()'. –

Antwort

5

Nullpointer wird ausgelöst, wenn eine Anwendung versucht, eine Objektreferenz zu verwenden, die den Null-Wert hat.

Sie sollten diesen Abschnitt in onStartCommand() nennen.

+1

aufrufen Ich wusste das nicht, vielen Dank. Würden Sie übrigens bestätigen, dass das Starten eines Dienstes von einem GcmTaskService der beste Weg ist, große Datenmengen alle 10 Stunden herunterzuladen? –

+0

welche anforderungen? Was sind die Alternativen? –

+1

Schwerer Mittelwert zwischen wenigen Ko to Go Daten (es synchonisiert Kurse, die offline zur Verfügung gestellt werden und alle Arten von Medien enthalten können (also auch Videos)) –

0

Sie sollten Kontext einer Aktivität haben. Kontext des Dienstes wird nicht funktionieren. Im Konstruktor übergeben Sie den Kontext und verwenden Sie diesen Kontext, um den nächsten Konstruktor weiterzugeben.

public SyncOfflineCoursesService(Context mContext) { 

    sharedPreferenceManager = new SharedPreferenceManagerToReplace(mContext); 

} 
+0

Hallo und danke! Es gibt keine Aktivität, wenn der Dienst erstellt wird (er wird vom GCMTaskService erstellt) –

+0

#Payel. Müssen "onStartCommand()" Abschnitt –