2016-08-11 1 views
0

Ich habe meine eigene Array-Adapter-Klasse namens WordAdapter definiert. Hier ist mein CodeWarum funktioniert getContext(), aber der über Konstruktor übergebene Kontext funktioniert nicht?

Context context; 
int backgroundColor; 
private MediaPlayer mMediaPlayer = null; 

public WordAdapter(Context context, ArrayList<Word> words, int backgroundColor) { 
    super(context, R.layout.list_item, words); 
    this.context = context; 
    this.backgroundColor = backgroundColor; 
} 

private AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 

Der obige Code erzeugt eine Nullzeiger Ausnahme.

Aber dieser Code nicht:

Context context; 
int backgroundColor; 
private MediaPlayer mMediaPlayer = null; 

public WordAdapter(Context context, ArrayList<Word> words, int backgroundColor) { 
    super(context, R.layout.list_item, words); 
    this.context = context; 
    this.backgroundColor = backgroundColor; 
} 

private AudioManager audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); 

Warum wird der Kontext durch den Konstruktor übergeben nicht?

EDIT ich es in verschiedenen Aktivitäten aufrufen, wird eine davon unten angegeben:

itemsAdapter = new WordAdapter(this, words, R.color.category_numbers); 

wo itemsAdapter als WordAdapter deklariert und words eine Arraylist von Word Klassenpositionen ist.

+1

plz uns zeigen, wo Sie den Konstruktor – has19

+3

Verschieben rufen 'Audio-Manager = (Audio-Manager) context.getSystemService (Context.AUDIO_SERVICE);' innerhalb Methode –

+0

@ ρяσѕρєяK I definiert Kontext als globale Variable . Können Sie bitte (als Antwort) erklären, warum Ihre Methode funktionieren würde? –

Antwort

1

Gemäß dem Kommentar von prosperK erstellen und initialisieren Sie die Variable zur gleichen Zeit. Das bedeutet, dass der Kontext immer noch null ist, wenn Sie die audioManager-Variable erstellt haben.

Eine Abhilfe schafft die Initialisierung des AudioManagers im Contructor, wenn Ihr Kontext tatsächlich einen Wert hat.

+0

Aber ich habe 'Kontext' als globale Variable, deren Wert ich gleich der lokalen Variablen 'Kontext' gesetzt habe. Warum sollte der globale Kontextwert null sein? –

+1

Ihre globale Variable bleibt null, es sei denn, Sie geben einen Wert an. Der Wert wird im Konstruktor angegeben. Also, es sei denn, Konstruktor wird seine Null aufgerufen. Tatsache ist, dass Ihr globaler Variablenkontext und audioManager zur selben Zeit erstellt werden, in der Sie denselben Nullkontext verwenden, um audioManager zu initialisieren –

+0

Vielen Dank. Ich habs :) –

1

initialisieren Sie AudioManager im Konstruktor.

2

Da Felder auf ihre Standardwerte initialisiert werden, bevor der Konstruktor ausgeführt wird. Ihre Feldinitialisierung audioManager hängt von context ab, das nur in Konstruktor initialisiert wird.

Sie sollten die audioManager Initialisierung in Ihren Konstruktor verschieben, wenn sie von einem Konstruktorargument abhängt.

Anscheinend gibt getContext() eine Context zurück, die in der Feldinitialisierungsphase gültig ist.

Siehe auch: Are fields initialized before constructor code is run in Java?

Verwandte Themen