Нулевой указатель при расширении приложения Android

#android #nullpointerexception #android-context #applicationcontext

#Android #исключение nullpointerexception #android-контекст #applicationcontext

Вопрос:

Я экспериментировал с расширением приложения как быстрым способом получения доступа к объекту контекста приложения. У меня есть класс, подобный so:

 public class PageMonitorApplication extends Application
{
    @Override
    public Context getApplicationContext()
    {
        return super.getApplicationContext();
    }
}
  

И мой манифест включает:

 <application android:icon="@drawable/icon" android:label="@string/app_name" android:name=".PageMonitorApplication">
  

Однако при создании экземпляра PageMonitorActivity и вызове getApplicationContext() я получаю исключение с нулевым указателем. Во время отладки в eclipse и проверки экземпляра PageMonitorActivity я вижу это base=null .

Кто-нибудь может посоветовать, что не так?

Ответ №1:

super.getApplicationContext() возвращается, null потому что PageMonitorApplication это контекст приложения. Вы должны проверить, getApplicationContext возвращает null ли это значение, и если да, просто используйте Context то, что у вас уже есть.

Чтобы получить ссылку на PageMonitorApplication , вызовите getApplicationContext текущий Activity или Service (или другой Context , который у вас может быть).

Комментарии:

1. Я этого не понимаю… итак, в getApplicationContext () я мог бы просто вернуть это ?

2.Нет, дело в том, что PageMonitorApplication это контекст приложения. Вам вообще не нужен этот метод.

3. Но если я вызываю контекстный метод в экземпляре PageMonitorApplication, я получаю нулевой указатель. Например. Context context = new PageMonitorApplication(); context.getDatabasePath(«my_db»); вызывает нулевой указатель.

4. Когда вы говорите «экземпляр PageMonitorApplication», вы имеете в виду, что где-то в вашем приложении вы явно создаете его экземпляр ( new PageMonitorApplication() )? Вы никогда не должны этого делать. Вы всегда должны вызывать getApplicationContext текущее Activity или Service , чтобы получить ссылку на него. Создание его самостоятельно не приведет к его правильной инициализации.

5. В таком случае, у меня не тот конец флешки. Мне нужен был способ получить ApplicationContext из любого места моего приложения без передачи контекста в качестве параметра. Таким образом, PageMonitorApplication предназначалось для того, чтобы сделать это — создайте его экземпляр, и вы могли бы получить из него требуемый контекст. Но мне все еще нужен контекст, чтобы получить доступ к приложению PageMonitorApplication, тогда мне не лучше.

Ответ №2:

Внутри любого действия вы можете напрямую получить доступ к объекту ApllicationContext с помощью getApplicationContext().Нет необходимости создавать и экспериментировать с использованием класса Application.

Комментарии:

1. Я хотел упростить доступ к ApplicationContext вне действия.

2. что бы вы хотели сделать с ApplicationContext вне activity?

3. @JosephusVillarey Даже если ему нужно извне, он может отправить getApplicationContext() в качестве аргумента и получить его везде, где он хочет, в качестве параметра контекста. Не так ли?

4. Я экспериментировал со способами получения applicationcontext без передачи параметра контекста.

5. @JosephusVillarey На самом деле это теоретически, но если я хочу поместить что-то в область хранения файлов приложений, мне понадобится контекст, и это действие необязательно должно быть в Activity.