NullPointerException в действии - PullRequest
1 голос
/ 16 февраля 2012

Я немного новичок в Android и пытаюсь разработать свое первое производственное приложение.Это пользовательское приложение для хранения данных, которое состоит из списка действий и диалогового окна добавления, а также адаптера БД.Все мои функции "CRUD" (создание, чтение, обновление, удаление), кажется, работают отлично.Но я сталкиваюсь со следующей ошибкой, когда меняю ориентацию диалога добавления, когда данные не были сохранены в БД.Другими словами, моя функция onSavedInstanceState () не работает, когда я меняю ориентацию с портретной на альбомную или наоборот.

02-16 11: 42: 05.321: E / AndroidRuntime (347): java.lang.RuntimeException: невозможно приостановить действие {net.learn2develop.Homework / net.learn2develop.Homework.HomeworkEditActivity}: java.lang.NullPointerException

вот мой код:

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);
    }
}

}

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Тот факт, что сообщение NullPointerException содержит «Невозможно приостановить действие», означает, что проблема связана с переопределением onPause(..). Я предполагаю, что это происходит, когда mDbHelper имеет значение null, хотя, глядя на ваш код, я не понимаю, почему это так.

0 голосов
/ 22 апреля 2013

Попробуйте переключить mDbHelper.close () и super.onPause ()

Примерно так:

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

99% времени вы должны сначала вызвать метод super.onPause (),Вызов super.onPause () делает многое за кулисами.У меня были редкие случаи, когда мне нужно было вообще удалить вызов метода super.Это не похоже на то, что это один из них.

Более подробную информацию смотрите здесь:

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

...