8

alır o var ve programın diğer bölümlerinde değil/Etkinlik? Bu yaklaşım Google tarafından yapılan bir öğreticide kullanılmıştır - boş bir etkinlikle bir uygulama oluştursanız ve yeni oluşturulmuş bir ContentProvider'da bu yöntemi oluştursanız bile ContentProvider kodu https://github.com/udacity/Sunshine-Version-2/blob/sunshine_master/app/src/main/java/com/example/android/sunshine/app/data/WeatherProvider.java için bağlantıdır.Android:.</p> <blockquote> <p>Yöntem çağırma getContext.getContentResolver() üretebilir NullPointerException</p> </blockquote> <p>neden: getContext() getContentResolver() bazen bu ek açıklama almak neden sormak istiyorum NullPointerException

ContentProvider'ın dışında uri geçtiğinde ve sonra/insert/delete bittikten sonra getContext().getContentResolver().notifyChange(uri, null);'u kullanmalı mıyım? ya da belki bir şekilde tamir edebiliriz?

+0

Sadece basit uyarı 'getContext()' 'null' dönebileceğini IDE'nizde eğer olduğunu ... o satır için o uyarıyı devre dışı bırakmak için sorun değil ve getContext(). getContentResolver() ', daha sonra bir' NullPointerException 'oluşturabilir. – Tom

cevap

8

sen kaynağında bakacak olursak ContentProvider (sadece SHIFT tuşunu basılı tutun ve Android Studio'daki sınıf ismine tıklayın), uygulamanın mContext gibi bir Bağlam nesnesinin nesnesini tuttuğunu göreceksiniz.

Çözümünüz yalnızca aynıdır, yani ContentProvider'ın mContext değeri boşsa, başvurunuz da boş olacaktır. Yani buna gerek yok.

Size yardımcı olmak için, bu tür bir yapı oluşturuyorsanız, bu yalnızca IDE'nizin bir uyarısıdır. Ancak bu durumda içerik her zaman bağlam olacaktır, çünkü ContentProvider sisteminiz tarafından oluşturulur.

... 
@SuppressWarnings("ConstantConditions") 
public class NoteProvider extends ContentProvider { 
... 
+0

Tüm sınıftaki bu tür uyarıları görmezden gelmek gerçekten kötü bir fikirdir, en azından bu kod satırından önce '// noinspection ConstantConditions 'gibi bir şey kullanmalısınız - bu uyarı yalnızca sonraki satır için kapatılır – mmrmartin

2

Yazma getApplicationContext().getContentResolver() Bu işe yarayacak.

+1

Yalnızca 'getContext(). GetApplicationContext(). GetContentResolver(); 've' getContext(). getApplicationContext() 'partisi aynı sonucu üretiyor. –

7

Eğer getContext()boş o zaman sadece bu uyarıyı gözardı edebilirsiniz olamaz emin olabilirsiniz edin. Ben uyarı bile sadece boş olup olmadığını kontrol ait kaybolur düşünüyorum:

if (getContext() != null) { 
    getContext().getContentResolver(); 
} 

sadece getContext()boş ise kod yürütülmez akılda tutmak gerekir.

Alkış

düzenleme: Farklı bağlamları alabilir çünkü @Shivani Gupta sana verdiği cevap dikkat . Bkz .: Difference between getContext() , getApplicationContext() , getBaseContext() and "this"

0

Bir nesneyi veya bir nesnenin yöntemini kullanmaya çalıştığınızda, kullanacağınız üye/yöntem null olduğu nesne ise çalışma zamanı istisnası olabilir. obj bir nesnenin bir üye/yöntemini kullanmak istediğinizi varsayalım. Bunu şu şekilde kullanırsanız, sorunu önlemişsiniz demektir. Ancak, bu gibi istisna olarak ele isteyebilirsiniz:

try { 
    //use members/methods of obj 
} catch (NullPointerException npe) { 
    //handle the NullPointerException 
} 
0

Tamam ben sınıfın uzaklaştırmak üzerinde Bağlam ilan ederek kendim sabit görünüyor.

public class NoteProvider extends ContentProvider { 
    Context context; 

sonra context.getContentResolver() Ben kullandığımda Bağlam olduğundan emin yapılmış olduğunu düşünüyorum onCreate()

@Override 
    public boolean onCreate() { 
     mSQLiteOpenHelper = new NoteDbHelper(getContext()); 
     context = getContext(); 

     return true; 
    } 

bunu başlatılıyor NotifyChange (uri, null).; veya retCursor.setNotificationUri (context.getContentResolver(), uri); insert/update/delete/query method- retCursor belirtilen yöntemlere göre imleç döndürülür.

Telefonumda uygulamayı çalıştırdım ve muhtemelen bu yazı için bir düzenleme olacaksa sorunum olmadı.

DÜZENLEME: Sonuçta bir fark yapmaz

- @Mate tarafından explanationin cevap, sanırım bunun için teşekkür Ben şimdi olsun:]

+1

çözümünüz sadece IDE'yi kandırıyor, getContext size ContentProvider'ın mContext'i için bir başvuru sunuyor, eğer bu null değilse, içeriğiniz de boş olacaktır. Ama endişelenme, boş olamaz, cevabımı gör. – Mate

0

ContentProvider getContext() docs göre::

bu sağlayıcı çalışan Bağlam alır IDE'nizde hatayı önlemek için sadece sevdiği sınıf tanımının yukarıda @SuppressWarnings ("ConstantConditions") yazın. Sadece onCreate() çağrıldığında kullanılabilir - bu, kurucuda null değerini döndürür. onCreate() bu çağrılardan önce çağrılmalıdır çünkü

Yani getContext() yöntem insert(), update() veya delete() içinde null döndürmez.

yüzden böyle durumda kullanmak eğer

//noinspection ConstantConditions 
getContext().getContentResolver().notifyChange(uri, null); 
İlgili konular