Frage

Ich habe eine große Anzahl von Fehlerberichten von Benutzern erhalten, die aus erzwungenen Schließdialogen gemeldet wurden, in denen etwa Folgendes angegeben ist:

java.lang.ExceptionInInitializerError
at com.MyRequest.execute(MyRequest.java:59)
at org.nsdev.MySyncAdapter.onPerformSync(MySyncAdapter.java:90)
at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:164)
  Caused by: java.lang.RuntimeException: 
  Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
at android.os.AsyncTask.<clinit>(AsyncTask.java:152)

Jetzt habe ich versucht herauszufinden, wie ich dieses Problem am besten lösen kann.In meiner onPerformSync-Implementierung erstelle ich eine Reihe von AsyncTasks und führe sie aus.Ich vermute, mein Problem ist, dass ich nicht auf den Abschluss dieser Aufgaben warte, bevor ich von onPerformSync zurückkehre.Ich habe Folgendes versucht:

Looper.prepare();

// Execute async tasks

Looper.loop();

Und dann habe ich einen Zähler eingerichtet und wenn dieser Zähler auf Null abfällt, rufe Looper.myLooper (). quit () innerhalb des Rückrufs von den asynchronen Tasks auf.

Dies führt jedoch dazu, dass meine Anwendung mit dem folgenden Laufzeitfehler noch härter abstürzt:

java.lang.RuntimeException: Main thread not allowed to quit
    at android.os.MessageQueue.enqueueMessage(MessageQueue.java:175)
    at android.os.Looper.quit(Looper.java:173)
    at org.nsdev.MySyncAdapter$1.requestFinished(MySyncAdapter.java:89)
    at com.MyAsyncTask.onPostExecute(MyAsyncTask.java:84)
    at android.os.AsyncTask.finish(AsyncTask.java:417)
    at android.os.AsyncTask.access$300(AsyncTask.java:127)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4627)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    at dalvik.system.NativeStart.main(Native Method)

Haben Sie eine Idee, wie ich meine Synchronisierung korrekt durchführen kann?

War es hilfreich?

Lösung

Ich weiß, dass dieser Beitrag alt ist, aber für andere, die auf diesen Thread stoßen, wie wäre es, wenn Sie looper.quit () im Haupt-Thread nicht aufrufen?Das Folgende funktioniert für mich von einem SyncAdpater-Dienst, der mehrere AsyncTasks erzeugt, obwohl es andere Gründe geben kann, dies in Bezug auf die Leistung nicht zu tun ...

Handler h = new Handler(Looper.getMainLooper());
            h.post(new Runnable() {
                public void run() {

                    // AsyncTask... execute();
                }
            });

Andere Tipps

Eigentlich kannst du nicht.AsyncTask verwendet den Haupt-UI-Thread und stützt sich auf Handler und Looper, die dort nicht verfügbar sind.Verwenden Sie die reine Thread-Implementierung. AsyncTask sollte nur in den Aktivitäten verwendet werden.

Die Antwort von abloc löst das Problem, aber das Problem bei dieser Lösung ist, dass die Benutzeroberfläche einfriert. Dieses Problem ist in Android 2.2 und Android 2.3 vorhanden.Der Trick, den ich gefunden habe, bestand darin, einen Konstruktor von AsyncTask in meiner Klasse SyncAdapter aufzurufen und Looper.prepare() zu verwenden:

/**
 * Constructor. Obtains handle to content resolver for later use.
 */
public SyncAdapter(Context context, boolean autoInitialize) {
    super(context, autoInitialize);
    mHandler = new Handler();
    //Crear un dummy AsyncTask
    new AsyncTask<Void, Void,String>() {
        @Override
        protected String doInBackground(Void... params) {
            return null;
        }
    }.execute(null,null);
}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top