AdvertisingIdClient getAdvertisingIdInfo hangs forever

戏子无情 提交于 2019-12-05 16:57:33

问题


I'm trying to get advertising ID from Google Play services API. Here is a sample code:

...
import com.google.android.gms.ads.identifier.AdvertisingIdClient;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException;
...

public class MyActivity extends Activity {

    @Override
    protected void onStart() {
        super.onStart();
        Thread thr = new Thread(new Runnable() {
            @Override
            public void run() {
            try {
                Context ctx = MyActivity.this.getApplicationContext();
                AdvertisingIdClient.Info adInfo = AdvertisingIdClient.getAdvertisingIdInfo(ctx);
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (GooglePlayServicesRepairableException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (GooglePlayServicesNotAvailableException e) {
                e.printStackTrace();
            }
        });

        thr.start();
        synchronized (thr) {
            try {
                thr.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

When I'm calling getAdvertisingIdInfo method, application hangs forever (no matter with debugger or not).

I'm using Windows ADT 22.3, Android SDK API 19, Google Play SDK rev. 16, Android 4.4.2 Nexus devices. I'm integrating API as described here: https://developer.android.com/google/play-services/id.html

What could be a reason?


回答1:


I found the reason. It shouldn't block onStart() handler because blocked context blocks Play API in ID settings obtaining. Fixed code looks like this:

@Override
protected void onStart() {
    super.onStart();
    Thread thr = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Context ctx = MyActivity.this.getApplicationContext();
                AdvertisingIdClient.Info adInfo = AdvertisingIdClient.getAdvertisingIdInfo(ctx);
                finished(adInfo);
            } catch (...) {
                // All exceptions blocks
            }

            finished(null);
        }
    });

    thr.start();
}

private void finished(final AdvertisingIdClient.Info adInfo){
    if(adInfo!=null){
        // In case you need to use adInfo in UI thread
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // Do some stuff with adInfo
            }
        });
    }
}

It would be helpful if official instructions had such usage comments.




回答2:


Unfortunately the getAdvertisingIdInfo call needs to be done from a background thread, you should not block the main thread while invoking it. Seems like there is no option to get the AdId synchronously.

---- EDIT----

I could achieve this by running on a new thread. Here is what finally work for me. It is not hanging anymore (May not be an ideal)

getGAIDSync(){
 final CountDownLatch  latch  = new CountDownLatch(1);
 new Thread(new Runnable() {
            @Override
            public void run() {               
                getGoogleAdsIDAsyncTask.execute().get(5000, TimeUnit.MilliSecond);
               latch.countDown();                
    }}).start();
    try {
        latch.await(5000,TimeUnit.MILLISECONDS);
    } catch (InterruptedException e) {
         e.printStackTrace();
    }

}


来源:https://stackoverflow.com/questions/23379879/advertisingidclient-getadvertisingidinfo-hangs-forever

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!