AdvertisingIdClient getAdvertisingIdInfo blockiert durch main-thread
Ich versuche zu warten, die Antwort von AdvertisingIdClient.getAdvertisingIdInfo(Aktivität), ohne Erfolg. Diese Methode niemals Antwort, bis der Haupt-thread wurde beendet.
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 dieser code
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
Gleichen logcat mit mehr Wartezeit (5s)
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
Jedes mal, wenn die getAdvertisingIdInfo(), die in einem anderen thread blockiert ist, durch den Haupt-thread.
Was ist der Grund ? und wie macht man das ?
- Haben Sie sich überlegt mit AsyncTask?
- Ja, ich versuche, AsyncTask, das problem ist das gleiche.
- Dann meine Vermutung ist, dass
m_info.getId();
blockiert. - m_info.getId() nicht aufgerufen, hier (fallback "andere uuid" weil m_info ist null, weil die Antwort zu spät kommt).
- Haben Sie versucht, indem Sie den Aufruf isGooglePlayServicesAvailable in den thread?
- Ich habe versucht, es ändern nichts. Wenn Sie einen Blick auf die Protokolle, die thread starten und funktioniert gut, bis der getAdvertisingIdInfo() beginnen, und dann blockiert, bis der onCreate ist absolut fertig.
- Sie geben die Aktivität, die noch nicht fertig onCreate zu getAdvertisingUdInfo innen-Gewinde. Ich denke, es wartet für die Aktivität zu beenden onCreate. Versuchen Sie das abrufen der id in einem späteren Lebenszyklus-callback. Oder faul, in den ersten Platz.
- Es schien ein guter Punkt. Ich gehe all in onStart(), aber das problem ist immer noch vorhanden.
- Nur darauf hingewiesen, dass dieses Problem noch gibt. Ich habe das gleiche problem. Für alle die Antworten, die Anfrage ist definitiv auf einem hintergrund-thread. Hinweis: das problem ist NICHT, dass die Anfrage BLOCKIERT den main thread aber, dass es BLOCKIERT ist, DURCH den Haupt-thread. Einige interne bit-code ist irgendwie wartet am main, bevor Sie fortfahren. Noch auf der Suche nach einer Lösung. Fühlt sich an wie ein Spiel-SDK-Fehler.
- Können Sie bitte teilen Sie das Beispiel-Projekt in Github?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um die google ad ID, die Sie nicht brauchen, um ausführen die Methode
getAdvertisingIdInfo
auf dem Haupt-thread.Ich verwende Async Task zum verwalten der Extraktion der google ad ID.
Müssen Sie auch hinzufügen, um die app zu bauen.gradle auf die Abhängigkeiten der Linie
Werden und sicher sein, Sie haben auf den Android SDK manager auf "EXTRAS Google-Repository" aktualisiert
In der Literatur über AdvertisingIdClient es sagt, um nicht den Haupt-thread. Es wird eine exception werfen. Also, wenn du es in einen eigenen thread in Ordnung sein wird, ist sehr wahrscheinlich.
AdvertisingIdClient Referenz
Laut der docs (hier) :
Auch hier:
Also Sie sagen, es blockiert...
Sie müssen diesen code in einem hintergrund-thread.