마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

비동기 처리 시, Context부분에서 에러가 나는 것 같습니다 ㅜㅜ

0 추천

AsyncTask 비동기 처리 시, Context가 필요한 부분에서 nullPointerException이 계속 떨어지는데요.

제 감은 비동기 처리에서의 Context 처리 부분이 문제인데... 원인을 좀 알려주실 수 있나요...?

한번 에러난 이후로 재현이 잘 안되서 잡기가 어렵네요 ㅠㅠㅠ



private void getFirstData() {
        PrefUtil.getEditor(this).putString(Const.PREF_KEY_NOTICE_DATA, "").commit();
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                String result = NetworkUtil.connectGet(IntroActivity.this, API.getHomeUrl(PrefUtil.getPref(IntroActivity.this).getInt(Const.PREF_KEY_SELECTED_AGE_TYPE, 0)));
                Gson gson = new Gson()
                data = gson.fromJson(result, HomeResponse.class);

                // SharedPreferences에 객체 저장, IntroActivity.this 는 Context로 캐스팅 
                // 해당 구간에서 에러남 
                data.saveToLocal(IntroActivity.this);

                    result = NetworkUtil.connectGet(IntroActivity.this, API.FIRST_NOTICE_URL);
                    NoticeResponse response = new Gson().fromJson(result, NoticeResponse.class);
                    if (response != null && response.getCode() == 0)
                        PrefUtil.getEditor(IntroActivity.this).putString(Const.PREF_KEY_NOTICE_DATA, new Gson().toJson(response.getNotice())).commit();

                notiProcessDone();
            }
        });
    }

 

구구구구비둘기 (270 포인트) 님이 2017년 9월 26일 질문

1개의 답변

0 추천
AsyncTask에서는 Context에 직접 접근할 수 없습니다.

AsyncTask를 상속받는 클래스를 만드시고, 클래스의 constructor에 Context를 받으셔서

WeakReference<Context>를 들고 사용해야 합니다.

https://stackoverflow.com/questions/37531862/how-to-pass-context-in-async-task
minor (13,710 포인트) 님이 2017년 9월 26일 답변
WeakReference 개념을 처음 알게된게 API문서에서 알게된건 아니라서 API문서에도 있을지는 모르겠습니다. VM쪽 공부하면서 GC와 Reference 처리에 대해서 다룰 때 알게되었던 걸로 기억하고 있습니다.
최초 설치시에 Null이 발생하는건 항상 발생하는지 한번만 그런건지에 따라서 추측이 달라질 것 같습니다.
최초 설치시 한번만 Null인 현상은 내부 캐시정책때문인 것 같고, 지속적으로 발생하는 경우에는 LifeCycle이 맞지 않아서 context를 못찾는 걸 수 있습니다.
책 한권이나 문서 하나로 완벽하게 이해할 수 있는 개념은 아닌 것 같지만,
http://shop.oreilly.com/product/0636920029397.do
이 책이 thread와 asynctask, threadpool에 대해서 처음 배울 때 괜찮았었습니다.
http://d2.naver.com/helloworld/329631
한글 문서로는 이것도 깔끔하고 괜찮습니다.
와... 정말 감사합니다 ㅠㅠㅠㅠㅠㅠ UI 보다 Context가 훨씬 까다롭네요 ㅠㅠ
android는 UI thread나 메모리 정책이 특히 까다롭고 특이해서 고려해야할게 많습니다.
...