2013-05-04 2 views
0

Я создаю приложение, которое содержит 3 действия, скажем, A, B и C. Активность A - это основное действие, которое запускается при открытии приложения.android Nullpointerexception с данными о намерениях = null всегда

Деятельность A называется Activity B, используя startActivityForResult (цель, 1); Деятельность B возвращает результат, который успешно захвачен, и внутри onActivityResult Activity A, я запускаю Activity C, используя startActivityForResult (намерение2, 2);

Вот мой onActivityResult для деятельности

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    Log.d("MAIN","Inside on activity result requestCode is : " + requestCode); 
    if(requestCode == 1){ 
     if(resultCode == RESULT_OK){ 
      Log.d("MAINACT", "Inside RESULT CODE OK"); 
      if(data.getStringExtra("puzzleID")!=null){ 
       Log.d("MAINACT", "Inside puzzle has been selected"); 
       String puzzleIdResult = data.getStringExtra("puzzleID"); 
       Intent puzzleIntent = new Intent(MainActivity.this, TrialActivity.class); 
       puzzleIntent.putExtra("puzzleID", puzzleIdResult); 
       startActivityForResult(puzzleIntent, 2); 
      } 
     } 
    }else if(requestCode == 2){ 
     Log.d("MAINACT", "Inside request code is 2 result code is : " + resultCode); 
     if(resultCode == 0){ 
      if(data!=null){ 
      Log.d("MAINACT", "Inside STATUS NOT NULL"); 
      String puzzleStatus = data.getStringExtra("status"); 
      Log.d("MAINACT", "Puzzle status retrieved is : " + puzzleStatus); 
      if(puzzleStatus.equals("pause")){ 
       Log.d("MAINACT", "Inside puzzle status is paused"); 
      } 
    }else{ 
      Log.d("MAINACT", "Data is null!!"); 
    } 
} 

Это возвращаемый результат Intent от активности C

@Override 
protected void onPause() { 
    super.onPause(); 
    Log.d(TRIALTAG, "On Pause CALLED"); 
     Log.d(TRIALTAG, "Sending Intent"); 
     String puzzleID = Integer.toString(puzzle_ID); 
    Intent returnPause = new Intent(); 
    returnPause.putExtra("status", "pause"); 
    returnPause.putExtra("puzzleid", puzzleID); 
    if(getParent() == null){ 
     setResult(Activity.RESULT_OK, returnPause); 
    }else{ 
     getParent().setResult(Activity.RESULT_OK, returnPause); 
    } 
    finish(); 
} 

По возвращению из деятельности C, я получаю NullPointerException, и заявление.

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity 
{com.mypackagename.sudoku/com.mypackagename.sudoku.MainActivity}: java.lang.NullPointerException 

Я положил данные! = Null проверить позже, чтобы предотвратить сбой. Я получаю данные null! теперь каждый раз, когда я останавливаюсь в Activity C. Я пробовал метод getParent после прочтения других решений на SO, но это не помогает. Почему мои данные устанавливаются в Activity B, но не в Activity C? Это мое первое полноценное приложение, поэтому, пожалуйста, извините за незнание.

+0

пожалуйста отступ коды – stinepike

+0

страшного чтение коды чувак .. – Siddharth

+0

жаль бедного indenting..should've сделал его более разборчивым. . @ Shobhit Puri благодарю вас за то, что он убрал его ... сделаю это сам в следующий раз .. – KVNam

ответ

1

Похоже setResult метод() не вызывался, поскольку результирующий код устанавливается как за исключением является 0 (RESULT_CANCELED), а не -1 (RESULT_OK)

Вы уверены, что ваша деятельность С не врезаться в Integer. ToString (puzzle_ID) ??

Отладка метода onPause() операции C поможет вам устранить сбой.

PS: Вот почему вы должны избегать использования магических чисел, как если (ResultCode == 0)

PS: FYI, RESULT_CANCELED (0): Если ребенок деятельность не может по какой-либо причине (например, как сбой), то родительская активность получит результат с кодом RESULT_CANCELED.

Update

Настройка результата в OnPause() или OnDestroy не будут работать. Установить результат в любом onBackPressed() или в onFinish()

Смотреть это result not set in onPause() using setResult() when pressing the Back button

+0

Я попробовал отладку onPause(), и он дает правильное значение для String puzzleID, а также значение int, поэтому оно не сбой там. Ясно, что setResult не работает, потому что он все еще дает resultCode = 0. Спасибо за ответ .. все еще не уверены в том, что не так, но .. – KVNam

+0

Результат настройки в onPause() или onDestroy не работает. Установите результат либо в onBackPressed(), либо в onFinish() http://stackoverflow.com/questions/10023969/result-not-set-in-onpause-using-setresult-when-pressing-the-back-button – Anirudh

+0

Спасибо так много для того, чтобы указывать мне в правильном направлении, это работало как шарм. Нарисовал все это сейчас. Как выбрать этот бит в качестве ответа, или если вы можете отредактировать предыдущий ответ, я соглашусь с ним в качестве ответа. – KVNam

0
@Override 
protected void onDestroy() { 
    Log.d(TRIALTAG, "On Pause CALLED"); 
    Log.d(TRIALTAG, "Sending Intent"); 
    String puzzleID = Integer.toString(puzzle_ID); 
    Intent returnPause = new Intent(); 
    returnPause.putExtra("status", "pause"); 
    returnPause.putExtra("puzzleid", puzzleID); 
    if (getParent() == null) { 
     setResult(Activity.RESULT_OK, returnPause); 
    } else { 
     getParent().setResult(Activity.RESULT_OK, returnPause); 
    } 
    super.onDestoy(); 
} 

попробуйте использовать это. Я использовал onDestroy вместо onPause и удалил конец. и назвал supoer.onDestroy в конце.

+0

Wont onDestroy уничтожить мою деятельность? Я только хочу приостановить его и возобновить действие, когда пользователь нажимает кнопку «Продолжить» в действии A. Могу ли я продолжать это после onDestroy? – KVNam

+1

onactivityresult будет вызываться, когда ваша вызываемая деятельность является finisehd .. для связи между двумя действиями, которые вам понадобятся другим процессом, а не этим – stinepike

+0

Хорошо, я понимаю, что вы говорите, но мне нужно удалить Activity C из вида, когда он приостановлен, и отобразить Активность А пока пользователь не решит продолжить.finish() позволяет мне сделать это, но я предполагаю, что это не лучший способ. Спасибо за ответ, позвольте мне немного почитать об этом. – KVNam

Смежные вопросы