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

AsyncTask로 adid를 가져오는 방법에 대해 질문이 있습니다.

0 추천
public static void makeCommonJson(){
        final JSONObject identityJson = new JSONObject();
        new AsyncTask<Void, Void, Void>(){
            @Override
            protected Void doInBackground(Void... voids) {
                Log.d("log1", "1");
                try {

                    AdvertisingIdClient.Info info = AdvertisingIdClient.getAdvertisingIdInfo(context);
                    identityJson.put("adid", info.getId());
                    identityJson.put("adid_opt_out", info.isLimitAdTrackingEnabled());
                    Log.d("log2", identityJson.toString());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
        }.execute();

        try {
            Log.d("log3", "3");
            JSONObject deviceInfoJson = new JSONObject();
            boolean isPortrait = context.getResources().getConfiguration().orientation
                    == Configuration.ORIENTATION_PORTRAIT;
            Locale systemLocale = context.getApplicationContext().getResources().getConfiguration().locale;


            deviceInfoJson.put("os", Build.VERSION.RELEASE);
            deviceInfoJson.put("model", Build.MODEL);
            deviceInfoJson.put("resolution", getResolution());
            deviceInfoJson.put("is_portrait", isPortrait);
            deviceInfoJson.put("platform", "android");
            deviceInfoJson.put("network", getNetworkType());
            deviceInfoJson.put("carrier", getCarrier());
            deviceInfoJson.put("language", systemLocale.getLanguage());
            deviceInfoJson.put("country", systemLocale.getCountry());

            commonJson.put("identity", identityJson);
            Log.d("log4", identityJson.toString());
            commonJson.put("device_info", deviceInfoJson);
            commonJson.put("package_name", context.getPackageName());
            commonJson.put("appkey", appkey);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
02-24 14:02:06.208 30426-30426/? D/log3: 3
02-24 14:02:06.208 30426-30443/? D/log1: 1
02-24 14:02:06.218 30426-30426/? D/log4: {}
02-24 14:02:07.508 30426-30443/com.example.remasteredadbrix D/log2: {"adid":"a843470c-68f8-4e89-b853-0c17e108fb2a","adid_opt_out":false}

makeCommonJson 함수 내에서 adid(광고 ID)를 비롯한 device 정보를 가져와서 commonJson에 넣으려고 합니다.

문제가 발생하는 부분은 바로 adid입니다. asyncTask를 이용해 백그라운드 쓰레드에서 adid를 가져와 identityJson에

저장한 후 메인 쓰레드의 commonJson에서 사용하려고 합니다. 하지만 로그를 찍어보니 로그의 순서가 예상과 달랐습니다.

코드 순으로 로그가 찍히지 않고, 백그라운드 쓰레드의 로그가 더 늦는 것을 확인할 수 있었습니다.

그래서 log4 근처의 commonJson.put("identity", identityJson)에서 identityJson값이 null로 들어갑니다.

log를 보면 commonJson.put("identity", identityJson) 문장이 실행된 후 0.3초 이후 asyncTask의 작업이 완료되어

identityJson에 adid가 저장된 것을 볼 수 있습니다. 따라서 문제를 확실히 말하자면 백그라운드 쓰레드 작업과

메인 쓰레드의 동기화(?)가 제대로 되지 않는 것 같습니다. 제가 원하는 작업은 asyncTask의 백그라운드 작업(adid 추출)이

끝난 후 identityJson에 제대로 adid가 저장된 후, 그 identityJson을 commonJson에 넣는 것입니다.

이 문제를 어떻게 해결할 수 있을까요? Object 클래스의 wait(), notify() 메서드를 사용해 보기도 했지만

익숙하지 않은 탓인지 오류가 발생했습니다. 여러분들의 많은 답변을 기다리겠습니다. 답변에 미리 감사드립니다.

익명사용자 님이 2020년 2월 24일 질문

1개의 답변

0 추천
doInBackground 과정이 끝난 후 결과에 대한 처리는 onPostExecute메소드에서 하셔야 해요.  백그라운드 처리해야 하는 모든 작업을 doInBackground에서 하신후 결과값을 return하시고 onPostExecute에서 그값을 받아서 commonJson에 넣어서 사용하시면 될것같습니다.
익명사용자 님이 2020년 2월 25일 답변
...