2013-05-04 53 views
0

我正在創建一個應用程序,其中包含3個活動,比如說A,B和C.活動A是主要活動,當應用程序打開時啓動。android Nullpointerexception with intent data = null總是

使用startActivityForResult(intent,1)將活動A稱爲活動B; 活動B返回一個成功捕獲的結果,並且在ActivityA的onActivityResult中,我使用startActivityForResult(intent2,2)啓動Activity C;

這裏是我的活動A

@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!!"); 
    } 
} 

onActivityResult這是從活動Ç

@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檢查以防止崩潰。我得到的數據是空的!現在每當我在Activity C中暫停時,我在閱讀完SO上的其他解決方案之後嘗試了getParent方法,但這沒有幫助。爲什麼我的數據是在Activity B中設置的,而不是在Activity C中設置的?這是我第一個完整的應用程序,請原諒任何無知。

+0

請縮進代碼 – stinepike 2013-05-04 06:50:04

+0

可怕的閱讀你的代碼的傢伙.. – Siddharth 2013-05-04 06:53:33

+0

對窮人indenting..should've對不起變得更加清晰。 。@ Shobhit Puri非常感謝你的清理。下次我會自己做。 – KVNam 2013-05-04 08:58:13

回答

1

看起來的setResult不獲取稱爲()方法,因爲結果代碼設置爲每例外是0(RESULT_CANCELED),而不是-1(RESULT_OK)

你確定你的活動C不爲整數崩潰。的toString(puzzle_ID)??

調試Activity C的onPause()方法將幫助您解決崩潰問題。

PS:這就是爲什麼你應該避免使用幻數一樣,如果(resultCode爲== 0)

PS:僅供參考,RESULT_CANCELED(0):如果孩子失敗時會因任何原因(如崩潰),該父代活動將收到代碼爲RESULT_CANCELED的結果。

更新()

設置導致的onPause或不會的onDestroy工作。在任一onBackPressed結果集()或onFinish()

看到這個result not set in onPause() using setResult() when pressing the Back button

+0

我試着調試onPause(),它給出了字符串拼圖ID以及int值的正確值,所以它不會在那裏崩潰。很明顯,setResult不起作用,因爲它仍然給resultCode = 0.謝謝你的response.am仍然不確定什麼是錯誤的,但.. – KVNam 2013-05-04 08:57:13

+0

設置結果onPause()或onDestroy不會工作。在onBackPressed()或onFinish()中設置結果http://stackoverflow.com/questions/10023969/result-not-set-in-onpause-using-setresult-when-pressing-the-back-button – Anirudh 2013-05-04 09:27:49

+0

謝謝如此多的指導我朝着正確的方向發展,這就像一個魅力。現在想到了整個事情。我該如何選擇這一位作爲答案,或者如果您可以在早期編輯您的答案,我會接受這個答案。 – KVNam 2013-05-04 10:31:16

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 2013-05-04 08:40:42

+1

當你的被叫活動是finisehd時,onactivityresult會被調用。爲了在兩個runninga活動之間進行通信,你需要其他進程而不是這個 – stinepike 2013-05-04 09:01:16

+0

好吧我明白你在說什麼,但是我需要從視圖中刪除Activity C,當它暫停時,活動A直到用戶選擇繼續。完成()讓我這樣做,但我猜它不是最好的方式。感謝您的回覆,讓我稍微閱讀一下。 – KVNam 2013-05-04 09:25:48

相關問題