Android: значения статических полей теряются после установки один раз из статического блока - PullRequest
1 голос
/ 02 ноября 2011

Я работаю над проектом Android.У меня есть класс с некоторыми статическими полями.Я инициализирую эти поля из другого класса, используя статический блок.Но, когда к статическим полям обращаются позже в программе, значения, установленные в полях, теряются.

Пожалуйста, обратитесь к двум классам ниже:

public class Constants {
    static {
        String TAG = "Credentials";
        Log.d(TAG, "Inside static block");
        Logger.setCredentials(tempUserId, tempPasswd);
        Log.d(TAG, "Inside static block : Logger.userId : " + 
                Logger.userId + " : Logger.password : " + Logger.password);
        new Logger("Test");
        Log.d(TAG, "Inside static block : After creatinf object : Logger.userId : " + 
            Logger.userId + " : Logger.password : " + Logger.password);

    }
}

public class Logger {
    public static String userId;
    public static String password;

    public static void setCredentials(String userId, String password) {
        Logger.userId = userId;
        Logger.password = password;
        Log.d("Credentials","Inside setCredentials : Logger.userId : " + 
            Logger.userId + " : Logger.password : " + Logger.password);
    }

    public Logger(String tag) {
        super();
        Log.d("Credentials","Inside constructor : Logger.userid : " + 
            Logger.userId + " : Logger.password : " + Logger.password);
        if (Logger.userId == null || Logger.password == null) {
            throw new NullPointerException();
        } else {
        }
    }
}

Вывод программы:

Внутри статического блока

Внутри setCredentials: Logger.userId: testuser: Logger.password: abc.123

Внутри статического блока: Logger.userId: testuser: Logger.password: abc.123

Внутри конструктора: Logger.userid: testuser: Logger.password: abc.123

Внутри статического блока: после создания объекта: Logger.userId: testuser: Logger.password: abc.123

Внутри конструктора: Logger.userid: null: Logger.password: null

java.lang.NullPointerException

Код отлично работает при запуске в качестве Java-приложения.Значения полей теряются при запуске в Android.Подскажите, пожалуйста, что идет не так?

Еще одна вещь: если исключение обрабатывается в коде, то после обработки исключения статический блок вызывается снова.

1 Ответ

0 голосов
/ 02 ноября 2011

Это, вероятно, не ваша проблема сейчас, но учтите, что Android не дает вам большого контроля над тем, как долго живет ваш процесс (и, следовательно, ваши статические переменные). Android может убить ваш процесс (если ваше приложение приостановлено) и воссоздать его позже. Вы несете ответственность за сохранение состояния, где это необходимо и уместно.

...