0

フラグメントに次のコードがある場合:

public void doSomething() {
    if (getActivity() == null)
        return; // no null pointer exceptions here!
    // ...
    // do bunch of stuff here
    // ...

    getActivity().setTitle("done something"); // just whatever
}

ご覧のとおり、メソッドの最初でgetActivity()がnullかどうかを確認し、nullの場合は返します。ただし、nullでない場合、メソッドは実行を継続します。最後に、getActivity()を再度呼び出してタイトルを設定しますが、getActivity()がnullかどうかは確認しません。理論的には、この時点でフラグメントがアクティビティから切り離されている可能性があるため、getActivity()がnullになる可能性があり、したがって最後の行でNullPointerExceptionがスローされます。これに対する解決策は何ですか?getActivity()を呼び出すたびにnullかどうかを確認しますか?

編集:これを試しても、NPEを取得することは可能です-例を単純化するために毎回getActivity()を呼び出しました:

public void doSomething() {
    Activity activity = getActivity();
    if (activity == null)
        return; // no null pointer exceptions here!
    // ...
    // do bunch of stuff here
    // ...

    activity.setTitle("done something"); // just whatever
}

問題は、アクティビティのロードがまだ完了していないことではありません。これは、たとえば、イベントへの応答として、ロードの数分後に発生する可能性があります。問題はgetActivityの最初の呼び出しではなく、アクティビティがnullであるかどうかを確認してから最後に参照するまでの15行ほどで存在しなくなることです。

私は現在logcatを持っていませんが、これが起こっていることです。これは実際には見たことがありませんが、これはこの関数が1日に何千回も呼び出されるアプリ用であるため、誰かにたまに発生する可能性があります。

編集2:私が現在行っているのは、NPEを探してキャッチすることであり、失敗した場合は何もしません。しかし、それは問題を解決するための醜い方法のようです-もっと良い解決策があるかどうか疑問に思っています!

4

1 に答える 1

1

上部でgetActivityを1回呼び出し、変数に保存します。変更されないのに20回呼び出すのはなぜですか(変更された場合は、古いものと新しいものを組み合わせて使用​​すると、とにかく本当に悪い可能性があります)。

于 2012-11-15T20:11:55.387 に答える