Сначала объясните, как создаются проекты:
- Проект библиотеки 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();
}
}