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() 메서드를 사용해 보기도 했지만
익숙하지 않은 탓인지 오류가 발생했습니다. 여러분들의 많은 답변을 기다리겠습니다. 답변에 미리 감사드립니다.