Android: getContext (). getContentResolver () erhält manchmal NullPointerException

8

Ich möchte fragen, warum wir diese Anmerkung bekommen:

  

Der Methodenaufruf getContext.getContentResolver () erzeugt möglicherweise   NullPointerException

Warum ist es dort und nicht in anderen Teilen des Programms Fragment / Aktivität? Dieser Ansatz wurde im Tutorial von Google verwendet - hier ist der Link zum ContentProvider-Code Ссылка selbst wenn Sie eine Anwendung mit nur einer leeren Aktivität erstellen und diese Methode in einen neu erstellten ContentProvider einfügen, ist sie dort.

Sollen wir getContext().getContentResolver().notifyChange(uri, null); außerhalb von ContentProvider verwenden, um das uri zu erhalten, und nachdem das update / insert / delete fertig ist, notifyChange? oder können wir es irgendwie reparieren?

    
Radek O 07.10.2015, 10:41
quelle

6 Antworten

8

Wenn Sie in der Quelle von ContentProvider suchen (halten Sie einfach SHIFT gedrückt und klicken Sie auf den Klassennamen in Android Studio), dann werden Sie feststellen, dass die Implementierung ein Objekt vom Typ Context als mContext enthält.

Ihre Lösung ist genau die gleiche. Wenn mContext von ContentProvider null ist, ist Ihre Referenz ebenfalls null. Das ist also nicht nötig.

Um Ihnen zu helfen, ist dies nur eine Warnung Ihrer IDE, wenn Sie ein solches Konstrukt selbst erstellen. In diesem Fall wird jedoch immer ein Kontext vorhanden sein, da der ContentProvider von Ihrem System generiert wird. Um den Fehler in Ihrer IDE zu vermeiden, schreiben Sie @SuppressWarnings ("ConstantConditions") über Ihre Klassendefinition wie:

%Vor%     
Mate 08.10.2015, 20:13
quelle
7

Wenn Sie sicherstellen können, dass getContext () niemals null sein kann, können Sie diese Warnung einfach ignorieren. Ich denke, die Warnung verschwindet sogar von dir nur nach Null:

%Vor%

Sie müssen nur daran denken, dass der Code nicht ausgeführt wird, wenn getContext () null ist.

Prost

bearbeiten: Sei vorsichtig mit der Antwort, die @Shivani Gupta dir gegeben hat, weil du verschiedene Kontexte bekommen konntest. Siehe: Unterschied zwischen getContext (), getApplicationContext (), getBaseContext () und "this"

    
Altair68 07.10.2015 10:52
quelle
2

Schreibe getApplicationContext().getContentResolver() Hoffe, das wird funktionieren.

    
Shivani Gupta 07.10.2015 10:51
quelle
0

Immer wenn Sie versuchen, ein Mitglied oder eine Methode eines Objekts zu verwenden, können Sie eine Laufzeitausnahme haben, wenn das Objekt, dessen Mitglied / Methode Sie verwenden möchten, null ist. Angenommen, Sie möchten ein Mitglied / eine Methode eines Objekts verwenden, obj . Wenn Sie es so verwenden:

%Vor%

Dann hast du das Problem verhindert. Möglicherweise möchten Sie dies jedoch als Ausnahme behandeln:

%Vor%     
Lajos Arpad 07.10.2015 11:31
quelle
0

Ok, ich habe es selbst behoben, indem ich Kontext am Anfang der Klasse deklariert habe.

%Vor%

initialisiert es dann in onCreate ()

%Vor%

Ich denke, das stellte sicher, dass ich immer Kontext habe, wenn ich context.getContentResolver (). notifyChange (uri, null); oder retCursor.setNotificationUri (context.getContentResolver (), uri); in einfügen / update / delete / abfragemethode- retCursor wird durch die angegebenen Methoden zurückgegeben.

Ich habe die Anwendung auf meinem Telefon ausgeführt und hatte noch keine Probleme, wenn ich es werde, wird es wahrscheinlich eine Bearbeitung für diesen Beitrag geben.

BEARBEITEN:

Es macht schließlich keinen Unterschied - Erklärung in Antwort von @Mate, danke dafür, ich denke, ich bekomme es jetzt:]

    
Radek O 07.10.2015 23:42
quelle
0

Laut ContentProvider getContext() docs :

  

Ruft den Kontext ab, in dem dieser Provider ausgeführt wird. Nur onceCreate () wurde nur einmal aufgerufen - dies gibt null im Konstruktor zurück.

Die Methode getContext() gibt also null in insert() , update() oder delete() nicht zurück, weil onCreate() vor diesen Aufrufen aufgerufen wird.

Es ist also in Ordnung, diese Warnung für diese Zeile zu deaktivieren, wenn Sie sie in einem solchen Fall verwenden ...

%Vor%     
mmrmartin 01.03.2018 16:03
quelle