2012-05-18 1 views
-1

У меня есть два класса, MainActivity и DoHardWork. DoHardWork расширяет AsyncTask, и в классе мне нужно получить доступ к контексту, чтобы получить contentResolver и выполнить запрос.Не удается получить доступ к getContentResolver() из контекста?

Без проблем, не так ли? Давайте просто передать его в качестве параметра DoHardWork:

Context currCont = this; 
    new DoHardWork(currCont).execute(); 

Тогда в конструкторе я хватаю контекст и сохранить его в глобальной переменной называется ccc.

Но как только я пытаюсь получить доступ к контексту, он сбой, без ошибок, которые имеют смысл.

try { 
    Cursor cursor = ccc.getContentResolver().query(
      Uri.parse("content://sms/inbox"), null, null, null, null); 
} 
catch (Exception e) { 
    Log.e("apptag", e.getMessage()); 
    e.printStackTrace(); 
} 

Все, что я получаю:

05-18 18:54:06.725: E/apptag(29063): Crashed 
05-18 18:54:06.725: E/apptag(29063): java.lang.NullPointerException 
05-18 18:54:06.725: E/apptag(29063): at android.content.ContextWrapper.getContentResolver(ContextWrapper.java:91) 
05-18 18:54:06.725: E/apptag(29063): at se.jbhalmstad.ndroid.DoHardWork.getTextMessages(DoHardWork.java:214) 
05-18 18:54:06.725: E/apptag(29063): at se.jbhalmstad.ndroid.DoHardWork.returnResults(DoHardWork.java:114) 
05-18 18:54:06.725: E/apptag(29063): at se.jbhalmstad.ndroid.DoHardWork.doInBackground(DoHardWork.java:55) 
05-18 18:54:06.725: E/apptag(29063): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
05-18 18:54:06.725: E/apptag(29063): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
05-18 18:54:06.725: E/apptag(29063): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
05-18 18:54:06.725: E/apptag(29063): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
05-18 18:54:06.725: E/apptag(29063): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
05-18 18:54:06.725: E/apptag(29063): at java.lang.Thread.run(Thread.java:856) 

Почему я не могу получить доступ к контексту?

+0

Я не думаю, что e.printStackTrace печатает в журнале. Однако малоизвестный факт, вы можете передать исключение в качестве параметра в оператор журнала. Попробуйте Log.e («apptag», «Crashed!», E); и посмотрите, получите ли вы более полезный вывод. –

+0

Он напечатал журнал. Я получаю такое же исключение, если передать его в качестве параметра в Log.e(). Я обновляю первый пост со всем исключением, если это помогает. – qwerty

+1

Вместо сохранения 'Context', переданного как аргумент, попробуйте вызвать' getApplicationContext() 'на нем. –

ответ

1

Обнаружена проблема.

Как это работает, так это из класса MainActivity, я устанавливаю повторяющийся AlarmManager. Когда будильник отключается, класс GetOperations действует как BroadcastReceiver и запускается. Поскольку мне нужна тяжелая работа в классе AsyncTask, у меня есть все это в классе DoHardWork. (Да, я знаю, что имена плохие, и большая часть кодирования нуждается в улучшении в любом случае). Но я не могу назвать DoHardWork из BroadcastReceiver, мне нужно вызвать его из MainActivity. Поэтому вместо того, чтобы пытаться вызвать его из BroadcastReceiver i, создайте новый экземпляр MainActivity и вызовите метод, который затем вызывает DoHardWork. Вот где я сделал проблему. MainActivity не является статичным, поэтому, когда я создал новый экземпляр, контекста не было.

То, что я закончил, - это передача контекста из BroadcastReceiver в MainActivity.

Возможно, это было очень грязно, но я надеюсь, что вы получите его суть. Спасибо вам за помощь!