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?

InformationsquelleAutor Mapond | 2015-01-15
Schreibe einen Kommentar