#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.