2012-04-29 6 views
7

私はアプリケーションを作成しましたが、リリース後、一部のユーザーが厄介なバグを経験しているようです。私は単に再現することができません。Android onActivityResult。メンバー変数がnullであることがあります

これには3つのアクティビティが含まれます。

活動1:SuperActivityは

public abstract class SuperActivity extends Activity 

活動2:MainActivity

public class MainActivity extends SuperActivity { 

    private MyObject myMemberVariable;  

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

    //Get the intent that started this activity. I am always providing Extras, so this is never null. 
    Bundle bundle = getIntent().getExtras(); 

    //Set stuff in myMemberVariable from these extras. This never fails either. 
    myMemberVariable = BundleLoader.loadFromBundle(bundle); 

    } 


    @Override 
    public void onListDialogClick(int requestCode, String[] options, int position, String extra) { 
    //THIS is the place where, according to my stacktrace from the DeveloperConsole, the null pointer arises. 
    myMemberVariable.setXY(position); 
    } 

アクティビティ3:ListDialogActivity

public class ListDialogActivity extends SuperActivity 

私はここでやっていることは、私はMainActivityからListDialogActivityを開始していますユーザにいくつかの選択肢を提示する。彼が選択を行うと、ListDialogActivityは結果を設定して終了します。 SuperActivityでは、私が持っている:

onActivityResult(int requestCode, int resultCode, Intent data) { 
    //if activityRequestCode was ListDialogRequestCode and the Result was RESULT_OK, then call onListDialogClick(..) with the appropriate values. 
} 

は、これが私のMainActivityでonListDialogClick()が呼び出される方法です(だから、あなただけの通常のonActivityResultと考えることができます())。そこでは、myMemberVariableがnullなので、ヌルポインター例外が発生するユーザーはほとんどありません。

私はここで何が起こっているのか理解できません。また、電話機の回転を処理するためにインスタンスの状態を保存していますが、onCreateが呼び出されてもnullにならず、状態を失い、最初のインテントから再作成されます。

誰でもこのことがどうやって起こっているのかを私に説明してもらえますか? Androidから何か迷ってしまったのですか?なぜそれは少数の人々に起こっているのですか?これの理由は何でしょうか?私はちょっとした提案についても本当に感謝しています。

ありがとうございます!

+1

これは起こっているデバイスの共通の要因ですか? – JRaymond

+0

私はまだ共通の要素を見つけていません(私はそれがCM9のあるGalaxy S2とHTCの1つのxを持つ人物に起こったと確信しています)。しかし、dev consoleはそうではありません。バグが出ているデバイスを私に見せてください。 – metter

+1

どこに 'myMemberVariable'が初期化されていますか?コードでは、 'private MyObject myMemberVariable = null;と等しいため、常にnullでなければならないことがわかります。 – zapl

答えて

10

zaplはonSaveInstanceStateの値を保存しなければならないという点で正しいです。私のケースでは、onActivityResultの前に実行されるonCreate()で復元していますので、NullPointerExceptionsはもうありません。

おそらくこれでソートしていますが、同じ問題で大変なことがありました。私のアプリはカメラを起動して写真を撮影し、キャプチャしたファイルをアプリのcurrentDirectoryにコピーします。ときどき写真が撮影されたときに、私はonActivityResultでNullPointerExceptionsを取得していました。

アクティビティがAndroidsのメモリ管理によって殺されていて、再作成されているため、すべてのメンバー変数が失われているはずです。これは明白ではなかった(このようなシームレスな殺し/復元のためにAndroidに帽子をかける!)。これはHTC Desire HDで起こっていて、非常にランダムだったので追跡が非常に難しかったです。

+0

この回答にはありがとうございます!私は同じ問題を抱えていて、私はそれを理解することができませんでした。よくやった;) –

+1

うわー、5年後、まだ関連して、私のお尻を保存しました。これに感謝します。そのような難解なバグ! – pete

関連する問題