2012-02-16 3 views
1

Android에 다소 익숙하며 처음 프로덕션 응용 프로그램을 개발하려고합니다. DB 어댑터뿐만 아니라 목록 활동 및 대화 상자 활동 추가로 구성된 사용자 정의 데이터 저장 응용 프로그램입니다. 모든 "CRUD"(작성, 읽기, 업데이트, 삭제) 기능은 완벽하게 작동하는 것 같습니다. 그러나 데이터가 db에 저장되지 않은 경우 추가 대화 상자의 방향을 변경할 때 다음 오류가 발생합니다. 즉, 세로에서 가로로 또는 그 반대로 방향을 변경할 때 내 onSavedInstanceState() 함수가 실패합니다.Activity에서 NullPointerException이 발생했습니다.

02-16 11 : 42 : 05.321 : 전자 메일 AndroidTool :

public class HomeworkEditActivity extends Activity{ 
      private Long mRowId; 

     // SQLite Db Helper 
      private HomeworkDbAdapter mDbHelper ; 




// declarations for SQLitedatabase actions 
private EditText mSubject; 
private EditText mDueText; 
private EditText mDescText; 



private Button btnSave = null; 

/** 
* Called when the activity 
* is first created 
*/ 
@Override 
protected void onCreate(Bundle savedInstanceState){ 

    // called to display the reminder edit class 
    super.onCreate(savedInstanceState); 

    // open the database 
    mDbHelper = new HomeworkDbAdapter(this); 

    // set the content view by the xml layout 
    setContentView(R.layout.homeworkedit); 


    // initialize the save button 
    btnSave  = (Button) findViewById(R.id.btnSave); 

    // initiate the edit text fields 
    mSubject = (EditText) findViewById(R.id.txtSubject); 
    mDueText = (EditText) findViewById(R.id.txtDueDate); 
    mDescText = (EditText) findViewById(R.id.txtDesc); 


    mRowId = savedInstanceState != null 
     ? savedInstanceState.getLong(HomeworkDbAdapter.KEY_ROWID) 
     : null; 

    // register listeners and set the text of the buttons to their default 
    registerButtonListenersAndSetDefaultText(); 

} 
private void setRowIdFromIntent(){ 
    if(mRowId == null){ 
     Bundle extras = getIntent().getExtras(); 
     mRowId = extras != null 
     ? extras.getLong(HomeworkDbAdapter.KEY_ROWID) 
     : null; 
    } 
} 
@Override 
protected void onPause(){ 

    mDbHelper.close(); 
    super.onPause(); 
} 

@Override 
protected void onResume(){ 
    super.onResume(); 
    mDbHelper.open(); 
    setRowIdFromIntent(); 

     populateFields(); 

} 

private void registerButtonListenersAndSetDefaultText() { 
    btnSave.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick (View v){ 
      mSubject.getText(); 
      mDescText.getText(); 
      mDueText.getText(); 

      saveState(); 
      setResult(RESULT_OK); 
      Toast.makeText(HomeworkEditActivity.this, 
        getString(R.string.task_saved_message), 
        Toast.LENGTH_SHORT).show(); 
      finish();            // return to list activity 
     } 



      }); 

} 

private void populateFields() { 
    if(mRowId != null){ 
     Cursor reminder = mDbHelper.fetchHomework(mRowId); 
      startManagingCursor(reminder); 
      mSubject.setText(reminder.getString(
         reminder.getColumnIndexOrThrow(HomeworkDbAdapter.KEY_SUBJECT))); 
      mDueText.setText(reminder.getString(
        reminder.getColumnIndexOrThrow(HomeworkDbAdapter.KEY_DUE))); 
      mDescText.setText(reminder.getString(
        reminder.getColumnIndexOrThrow(HomeworkDbAdapter.KEY_DESC))); 
    } 
    if(mRowId == null){ 
     onCreate(null); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState){ 

    try{ 
    outState.putLong(HomeworkDbAdapter.KEY_ROWID, mRowId); 
    }catch(NullPointerException npe){ 
     npe.printStackTrace(); 
    } 
    super.onSaveInstanceState(outState); 
} 



private void saveState() { 
    // add the save of the text reference here 
    String subject = mSubject.getText().toString(); 
    String due_date = mDueText.getText().toString(); 
    String desc = mDescText.getText().toString(); 



    if(mRowId == null){ 
     long id = mDbHelper.createHomework(subject, due_date, desc); 
     if(id > 0){ 
      mRowId = id; 
     } 
    }else{ 
     mDbHelper.updateHomework(mRowId, subject, due_date, desc); 
    } 
} 

}

+1

당신이 완전한 로그 캣을하시기 바랍니다 보낼 수 있습니까? – ademar111190

답변

1

NullPointerException 메시지가 "활동을 일시 정지 할 수 없습니다"가 포함되어 있다는 사실은 문제가 당신의 onPause(..) 오버라이드 의미 : NullPointerException이

여기 내 코드입니다. 나는 이것이 mDbHelper가 null 일 때, 당신의 코드를 보았을지라도 그것이 일어날 것이라고 나는 생각한다.

0

보십시오 전환 mDbHelper.close()와 super.onPause()과 같이

: 먼저 super.onPause() 메소드를 호출해야하는 시간의

@Override 
protected void onPause(){ 
    super.onPause(); 
    mDbHelper.close(); 
} 

99 %. super.onPause()를 호출하면 많은 일이 발생합니다. 나는 실제로 수퍼 메소드 호출을 완전히 제거해야 할 때가 있었다. 이것이 그들 중 하나 인 것처럼 보이지 않습니다.

더 자세한 내용은 여기를 참조하십시오 :

http://developer.android.com/training/basics/activity-lifecycle/pausing.html#Pause

관련 문제