2012-05-18 3 views
-1

나는 두 클래스, MainActivityDoHardWork을가집니다. 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 문에 전달할 수 있습니다. Log.e를 시도해보십시오 ("apptag", "Crashed!", e); 좀 더 유용한 출력물을 얻는 지보십시오. –

+0

로그에 인쇄했습니다. Log.e()에 매개 변수로 전달하면 동일한 예외가 발생합니다. 도움이된다면 전체 예외가있는 첫 번째 게시물을 업데이트했습니다. – qwerty

+1

인수로 전달 된'Context'를 저장하는 대신,'getApplicationContext()'를 호출 해보십시오. –

답변

1

발견.

작동 방식은 MainActivity 클래스에서 반복되는 AlarmManager를 설정하는 것입니다. 알람이 꺼지면 GetOperations 클래스는 BroadcastReceiver 역할을하여 실행됩니다. AsyncTask 클래스에서 무거운 작업이 필요하기 때문에 DoHardWork라는 클래스에이 모든 작업이 포함되어 있습니다. (예, 이름이 나쁘고 코딩의 대부분은 개선이 필요하다는 것을 알고 있습니다.)하지만 BroadcastReceiver에서 DoHardWork를 호출 할 수는 없으며 MainActivity에서 호출해야합니다. 그래서 BroadcastReceiver에서 호출하려고하는 대신 MainActivity의 새 인스턴스를 만들고 거기에 DoHardWork를 호출하는 메서드를 호출합니다. 그것이 내가 문제를 만든 곳입니다. MainActivity는 정적이 아니므로 새 인스턴스를 만들 때 컨텍스트가 없습니다.

내가 한 일은 BroadcastReceiver에서 MainActivity로 컨텍스트를 전달하는 것입니다.

설명하는 동안 이것은 매우 지저분 해졌 겠지만, 당신이 그 요점을 알기를 바랍니다. 모든 도움을 주셔서 감사합니다!

관련 문제