2015-01-15 2 views
0

Я стараюсь ждать ответа AdvertisingIdClient.getAdvertisingIdInfo (activity) без успеха. Этот метод никогда не реагирует до тех пор, пока основной поток не завершится.AdvertisingIdClient getAdvertisingIdInfo заблокирован основным потоком

import android.app.Activity; 
import android.os.Bundle; 
import android.os.SystemClock; 
import android.util.Log; 
import com.google.android.gms.ads.identifier.AdvertisingIdClient; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesNotAvailableException; 
import com.google.android.gms.common.GooglePlayServicesUtil; 
import java.io.IOException; 


public class MyActivity extends Activity { 

    private Activity m_activity = null; 
    private AdvertisingIdClient.Info m_info = null; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // start the thread with the getAdvertisingIdInfo() 
     startGoogleAdvertisingIdRequest(this); 

     // simulate a waiting loop, others app init, ... 
     for (int i=0; i<20; i++) { 
      SystemClock.sleep(100); 
     } 

     // get the uuid 
     String uuid = getGoogleAdvertisingId(); 

     // call a method who need the uuid 
     Log.i("UUID", "receive uuid: " + uuid); 
    } 


    public String getGoogleAdvertisingId() { 
     String uuid = null; 
     if (m_info != null) { 
      if (!m_info.isLimitAdTrackingEnabled()) { 
       uuid = m_info.getId(); 
      } else { 
       uuid = "another uuid"; 
      } 
     } else { 
      uuid = "another uuid"; 
     } 

     return uuid; 
    } 

    public void startGoogleAdvertisingIdRequest(final Activity activity) { 
     m_activity = activity; 
     if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity) == ConnectionResult.SUCCESS) { 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        AdvertisingIdClient.Info adInfo = null; 
        try { 
         Log.i("UUID", "before google request"); 
         adInfo = AdvertisingIdClient.getAdvertisingIdInfo(activity); 
         Log.i("UUID", "after google request"); 
        } catch (IOException e) { 
         Log.w("UUID", "getAdvertisingIdInfo IOException: " + e.getMessage()); 
        } catch (GooglePlayServicesNotAvailableException e) { 
         Log.w("UUID", "GooglePlayServicesNotAvailableException: " + e.getMessage()); 
        } catch (Exception e) { 
         Log.w("UUID", "GooglePlayServicesException: " + e.getMessage()); 
        } finally { 
         finished(adInfo); 
        } 
       } 
      }).start(); 
     } 
    } 

    private void finished(final AdvertisingIdClient.Info adInfo){ 
     if(adInfo != null){ 
      m_activity.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        m_info = adInfo; 
        Log.i("UUID", "runOnUiThread id: " + adInfo.getId()); 
       } 
      }); 
     } 
    } 
} 

Logcat этого кода

11:29:52.103 30810-30828/com.example.testuuid I/UUID﹕ before google request 
11:29:54.107 30810-30810/com.example.testuuid I/UUID﹕ receive uuid: another uuid 
11:29:54.127 30810-30828/com.example.testuuid I/UUID﹕ after google request 
11:29:54.151 30810-30810/com.example.testuuid I/UUID﹕ runOnUiThread id: d5dc3bfb-4756-490c-8f8e-2bedfb5e827a 

же LogCat с большим количеством ожидания времени (5с)

11:36:14.215 31413-31436/com.example.testuuid I/UUID﹕ before google request 
11:36:19.225 31413-31413/com.example.testuuid I/UUID﹕ receive uuid: another uuid 
11:36:19.293 31413-31436/com.example.testuuid I/UUID﹕ after google request 
11:36:19.315 31413-31413/com.example.testuuid I/UUID﹕ runOnUiThread id: d5dc3bfb-4756-490c-8f8e-2bedfb5e827a 

Каждый раз getAdvertisingIdInfo(), который находится в другом потоке, блокируется основной поток.

В чем причина? и как это сделать?

+0

Считаете ли вы использование [AsyncTask] (http://developer.android.com/reference/android/os/AsyncTask.html)? – Fildor

+0

@Fildor: Да, я пытаюсь AsyncTask, проблема такая же. – Mapond

+0

Тогда я предполагаю, что 'm_info.getId();' блокирует. – Fildor

ответ

1

В литературе о AdvertisingIdClient говорится, что он не используется в основной теме. Это вызовет исключение. Поэтому, если вы поместите его в свою нить, вы, скорее всего, будете в порядке.

AdvertisingIdClient reference

3

Чтобы получить Google объявления ID вам не нужно запускать метод getAdvertisingIdInfo в основном потоке. Я использую Async Task для управления извлечением идентификатора объявления Google.

import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import com.google.android.gms.ads.identifier.AdvertisingIdClient; 
import com.google.android.gms.common.GooglePlayServicesNotAvailableException; 
import com.google.android.gms.common.GooglePlayServicesRepairableException; 
import java.io.IOException; 

public class MainActivity extends AppCompatActivity { 
String GAID; // this is the String of the Google Ad ID that you'll receive upon onPostExecute 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    new GetGAIDTask().execute(); 
} 

private class GetGAIDTask extends AsyncTask<String, Integer, String> { 

    @Override 
    protected String doInBackground(String... strings) { 
     AdvertisingIdClient.Info adInfo; 
     adInfo = null; 
      try { 
       adInfo = AdvertisingIdClient.getAdvertisingIdInfo(MainActivity.this.getApplicationContext()); 
       if (adInfo.isLimitAdTrackingEnabled()) // check if user has opted out of tracking 
        return "did not found GAID... sorry"; 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (GooglePlayServicesNotAvailableException e) { 
       e.printStackTrace(); 
      } catch (GooglePlayServicesRepairableException e) { 
       e.printStackTrace(); 
      } 
     return adInfo.getId(); 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     GAID = s; 
    } 
} 

Кроме того, необходимо добавить в приложение build.gradle на зависимостях линии

compile 'com.google.android.gms:play-services-ads:7.8.0' 

И убедитесь, что у вас есть на менеджера Android SDK «ДОПОЛНИТЕЛЬНО Google Repository» обновленный

+2

Имейте в виду, что adInfo может быть нулевым – Lancelot

Смежные вопросы