Android Null Pointer Exception Madness? - PullRequest
       5

Android Null Pointer Exception Madness?

0 голосов
/ 18 августа 2011

Итак, у меня есть 3 действия, которые должны иметь доступ к одному и тому же объекту пользовательского класса (назовем его «a»), созданным мной при создании самого первого действия.

Поскольку «а» состоит из целой группы не примитивов, мне было трудно сделать Serializable или Parcelable.Вместо этого я создал Службу, которая привязывается к каждому действию, поскольку они выходят на передний план, и задает действие «а» в OnBind().

Теперь у 'a' есть метод получения, который получает другой объект другого пользовательского класса, хранящийся с тем же объектом (назовем его 'b').Во всех трех видах деятельности мне также нужно иметь доступ к «b».

Если я запускаю первый вид деятельности, используй кнопку для перехода ко второму виду деятельности, нажимай кнопку «домой» на моем телефоне,затем вернитесь в приложение, нажав на его значок, затем перейдите к третьему действию, нажав кнопку, я получу null pointer exception на «b», но не «a».

Однако, если я добавлю строку, которая печатает 'a getter для' b 'с sysout на шаге, где я нажимаю кнопку, чтобы перейти от второй операции к третьей, то исключение нулевого указателя не возникает.

Кто-нибудь знает, почему это так и как я могу решить проблему?

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Звучит так, как будто вы хотите рассмотреть класс singleton. Пример (и описание) в Java: здесь , но сводится к:

public class ClassicSingleton {
    private static ClassicSingleton instance = null;
    protected ClassicSingleton() {
        // Exists only to defeat instantiation.
    }
    public static ClassicSingleton getInstance() {
        if(instance == null) {
            instance = new ClassicSingleton();
        }
        return instance;
    }
}

Теперь, когда вы хотите получить доступ к одноэлементному объекту, просто используйте:

ClassicSingleton instance = ClassicSingleton.getInstance();

Решение Шерифа также подойдет (и я собирался сначала предложить это сам), но я предпочитаю одноэлементный маршрут, поскольку он немного чище с точки зрения ОО.

Синглтоны имеют (как минимум) следующие преимущества перед глобальным объектом:

  • Синглтоны используют ленивый экземпляр, поэтому они создаются только при первом обращении к ним, а не при его определении. Если создание объекта или его сопровождение обходится дорого, возможно, лучше использовать синглтон, а не использовать его в течение всей жизни приложения
  • Вы можете гарантировать, что всегда будет только один экземпляр синглтона - у глобального объекта может быть столько экземпляров, сколько у вас есть ресурсов для
1 голос
/ 18 августа 2011

Кажется, вы хотите, чтобы этот объект a был всегда там!

Я предлагаю расширить application

public class YourApplication extends Application {
    YourObject A;
    @Override
    public void onCreate(){
        A = new YourObject();
    }
    //add getters or setters //
}

Теперь в вашей деятельности:

YourApplication app;
app = app = ((YourApplication)getApplicationContext());

Наконец в вашем Mainfest: Добавить к <application>

android:name=".YourApplication"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...