java.lang.NullPointerException для статического поля в проекте библиотеки Android - PullRequest
1 голос
/ 21 февраля 2011

Сначала объясните, как создаются проекты:

  • Проект библиотеки Android с двумя классами:
    • UserActivity - использует статическое поле в HolderClass
    • HolderClass - у этого есть статическое поле Данные
  • Android-приложение, которое ссылается на проект библиотеки, имеет только один класс:
    • StarterActivity - при запуске приложения в onCreate оно устанавливает статическое поле Data в какое-либо значение и запускает UserActivity

Теперь проблема в следующем: иногда Я получаю исключение java.lang.NullPointerException для этого статического поля данных - как будто я никогда не инициализировал его (или значение было удалено за это время). Это никогда не происходило на моем тестовом устройстве, но я продолжаю получать сообщения об ошибках с клиентских устройств. Я могу только догадываться, как это происходит - возможно, пользователь отходит от приложения, затем возвращается, и система воссоздает весь контекст приложения, но в этом контексте HolderClass имеет пустое статическое поле Data?

Мой вопрос:

Является ли инициализация этого статического поля из действия onCreate в Activity неправильной? Должен ли я поместить данные в ApplicationContext? Или делать что-то еще?

Я открыт для всех предложений.

P.S. Если у вас есть проблемы с визуализацией из описания, вот как все, что я сказал, будет выглядеть в коде:

// IN ANDROID APP PROJECT
public class StarterActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 

        // just start activity in library
        Intent myIntent = new Intent(this, AutolaunchActivity.class);
        startActivityForResult(myIntent, 1);    
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // exit when activity from library exits
        finish();       
    }
}


// IN LIBRARY PROJECT

public class HolderClass {
    public static String Data;
}

public class UserActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 

        // init layout  
    }

    public void someButtonClicked() {
        HolderClass.Data.trim();
    }
}

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

Обычные способы обмена данными между действиями задокументированы здесь . Прерывистый характер ошибки подсказывает мне проблему синхронизации. Используете ли вы потоки в некоторых ваших инициализации? Кроме того, вы знаете, происходит ли NPE в StarterActivity или UserActivity?

0 голосов
/ 02 июня 2011

Хорошо, это была в основном проблема глобальных переменных - в конце концов, я решил ее, прочитав этот ответ: Как объявить глобальные переменные в Android?

...