web-dev-qa-db-ja.com

Android:getContext()。getContentResolver()がNullPointerExceptionを取得することがあります

この注釈が付けられる理由をお聞きしたいと思います。

メソッド呼び出しgetContext.getContentResolver()はNullPointerExceptionを生成する可能性があります

プログラムのフラグメント/アクティビティの他の部分にないのはなぜですか?このアプローチは、Googleが作成したチュートリアルで使用されています-ここにContentProviderコードのリンクがあります https://github.com/udacity/Sunshine-Version-2/blob/sunshine_master/app/src/main/Java/com /example/Android/sunshine/app/data/WeatherProvider.Java 空白のアクティビティだけでアプリケーションを作成し、そのメソッドを新しく作成されたContentProviderに配置した場合でも、そこにあります。

getContext().getContentResolver().notifyChange(uri, null); outside ContentProviderを使用してURIを渡し、更新/挿入/削除が終了した後、notifyChangeを使用する必要がありますか?または多分私たちはそれをどうにかして修正することができますか?

10
Radek O

ContentProviderのソースを見ると(Shiftキーを押しながらAndroid Studio)のクラス名をクリックするだけです)、実装がContext型のオブジェクトをmContextとして保持していることがわかります。

ソリューションはまったく同じです。つまり、ContentProviderのmContextがnullの場合、参照もnullになります。したがって、これは必要ありません。

あなたを助けるために、これはあなたのIDE自分でそのような構造を作る場合の警告です。しかしこの場合、ContentProviderはあなたのシステムによって生成されるので、常にコンテキストがあります。 IDE次のようにクラス定義の上に@ SuppressWarnings( "ConstantConditions")と書くだけのエラー:

...
@SuppressWarnings("ConstantConditions")
public class NoteProvider extends ContentProvider {
...
9
Mate

getContext()nullになることは決してないことを確認できる場合は、この警告を単に無視できます。 nullをチェックするだけで、警告が消えることさえあると思います。

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

getContext()nullの場合、コードは実行されないことに注意する必要があります。

乾杯

編集:さまざまなコンテキストを取得する可能性があるため、@ ShivaniGuptaからの回答には注意してください。参照: getContext()、getApplicationContext()、getBaseContext()と "this"の違い

7
Manuel B.

getApplicationContext().getContentResolver()を記述します。これが機能することを願っています。

2
Shivani Gupta

ContentProvider getContext() docs によると:

このプロバイダーが実行されているコンテキストを取得します。onCreate()が呼び出された場合にのみ使用できます。これにより、コンストラクターでnullが返されます。

したがって、getContext()メソッドはinsert()update()またはdelete()nullを返しません。これは、onCreate()はこれらの呼び出しの前に呼び出されます。

したがって、そのような場合に使用する場合は、その行の警告を無効にしても問題ありません...

//noinspection ConstantConditions
getContext().getContentResolver().notifyChange(uri, null);
1
mmrmartin

クラスの開始時にContextを宣言して、自分で修正したようです。

public class NoteProvider extends ContentProvider {
    Context context;

次に、それをonCreate()で初期化します。

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

        return true;
    }

context.getContentResolver()。notifyChange(uri、null);またはretCursor.setNotificationUri(con​​text.getContentResolver()、uri)を使用するときに常にコンテキストがあることを確認したと思います;挿入/更新/削除/クエリメソッドで-retCursorは、前述のメソッドによってカーソルが返されます。

私は自分の携帯電話でアプリケーションを実行しましたが、まだ問題はありませんでした。おそらくこの投稿の編集があるでしょう。

編集:

結局のところ、違いはありません-@ Mateによる回答の説明、私は今それを手に入れていると思います:]

1
Radek O

オブジェクトのメンバーまたはメソッドを使用しようとするときはいつでも、使用しようとしているメンバー/メソッドのオブジェクトがnullの場合、実行時例外が発生する可能性があります。オブジェクトのメンバー/メソッドobjを使用するとします。このように使用する場合:

if (obj != null) {
    //use members/methods of obj
}

その後、問題を防ぎました。ただし、次のように、例外として処理することをお勧めします。

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

これは通常、FragmentまたはDialogFragmentでgetActivity()またはgetContext()を呼び出してgetContentResolver()などの親アクティビティメソッドの1つを使用するときに発生します。これは、コンパイラがこれらのメソッドを疑っているためです。 null値を返す場合があります。

これを解決するには、getActivity()またはgetContext()を使用する代わりに;単にそれぞれrequireActivity()requireContext()を使用できます。これらのメソッドは、null以外の値が返されることを保証します。

あなたは答えを見ることができます ここ

0
Zain