AdvertisingIdClient getAdvertisingIdInfo hangs forever

前端 未结 2 1362
清歌不尽
清歌不尽 2021-02-20 03:54

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;
imp         


        
相关标签:
2条回答
  • 2021-02-20 04:02

    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();
        }
    
    }
    
    0 讨论(0)
  • 2021-02-20 04:04

    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.

    0 讨论(0)
提交回复
热议问题