2016-04-06 2 views
2

Je sauvegarde la configuration avec SharedPreferences et la charge dans la classe étend les services.Impossible d'instancier le service> java.lang.NullPointerException

Mais erreur lorsqu'on essaie obtenir des valeurs de config, erreur comme:

Impossible d'instancier kr.co.composer.callrecord.recorder.CallRecordService service: java.lang.NullPointerException

à la ligne:

final SharedPreferences mSharedPreference= PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

Dans la mise en page Configuration enregistrer une EditText:

final SharedPreferences prefs = PreferenceManager 
     .getDefaultSharedPreferences(this); 

serverUrl.setText(prefs.getString("autoSave", "")); 
serverUrl.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, 
           int count) 
    { 
    } 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, 
            int after) 
    { 
    } 
    @Override 
    public void afterTextChanged(Editable s) 
    { 
     prefs.edit().putString("autoSave", s.toString()).commit(); 
    } 
}); 

Et dans l'autre classe, je veux obtenir ces valeurs par ce code:

public class CallRecordService extends Service { 
    final SharedPreferences mSharedPreference= PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    @Override 
    public void onCreate() { 
     serverURL =(mSharedPreference.getString("autoSave", "")); 
    } 
} 
+1

Déplacer l'initialisation '' mSharedPreference' à l'intérieur onCreate() ', et enlever le modificateur' final'. –

+0

Il semble que votre contexte soit nul –

+0

Merci @MikeM. Votre réponse fonctionne. S'il vous plaît ajouter à la réponse pour accepter votre réponse. Je vous remercie. – vanloc

Répondre

1

NullPointerException est levée lorsqu'une application tente d'utiliser une référence d'objet, ayant la valeur nulle.

Ne pas

public class CallRecordService extends Service { 
    final SharedPreferences mSharedPreference= PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    // Call this in your onCreate() section . 
    @Override 
    public void onCreate() { 
     serverURL =(mSharedPreference.getString("autoSave", "")); 
    } 
} 

Do

public class CallRecordService extends Service { 
    final SharedPreferences mSharedPreference= 
    @Override 
    public void onCreate() { 
     PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); // You can pass context here 
     serverURL =(mSharedPreference.getString("autoSave", "")); 
    } 
} 
+0

Merci beaucoup. – vanloc

+1

@IntelliJ Just FYI: L'OP parle d'un 'Service'; vous avez cité les docs pour 'Activity'. De plus, un champ 'final' ne peut être assigné que dans un constructeur. Si vous voulez montrer l'initialisation 'mSharedPreference' dans' onCreate() ', vous devez supprimer le modificateur' final' dans la déclaration et ajouter 'mSharedPreference =' devant la première ligne de 'onCreate()'. –

+0

@MikeM. Monsieur. Mine erreur. Merci pour votre info vif. –

1

Vous ne pouvez pas appeler getApplicationContext() avant onCreate(). Au lieu de cela, vous pouvez le faire comme ceci:

public class CallRecordService extends Service { 
    @Override 
    public void onCreate() { 
     final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
     serverURL = sp.getString("autoSave", ""); 
    } 
} 
+0

Merci. J'ai résolu mon problème. – vanloc