2016-05-10 17 views
-1

Ich versuche, ein SDK zu verwenden, das scheint, einen Handler in meinem Dienst zu erstellen.looper.prepare ein ui Thread

Eine Fehlermeldung erschien, dass ich Handler nicht erstellen kann, wenn der Thread nicht Looper.prepare() aufgerufen hat, so dass ich Looper.prepare() aufrufen und dieses Problem verschwinden. Dieser Dienst muss jedoch nach einiger Zeit eine Aktivität starten, und diese Looper.prepare() scheint damit zu verfahren, da die erste UI-Funktion abstürzt und sagt, dass sie nicht von einem nicht-ui-Thread aufgerufen werden kann.

Ich bin etwas verwirrt darüber, warum das passiert, und die Forschung, die ich über Thread und Looper gemacht habe, hat mir nicht geholfen. Ich verstehe, warum wir keinen Handler erstellen können, wenn ein Looper nicht im Thread vorhanden ist, aber nicht, warum das Erstellen eines Looper die Verwendung des ui-Threads nachher verhindert.

Unter meinen Code vereinfacht:

public class MyService extends Service implement SDKCallback{ 

... 

void callSDK(){ 

    Looper.prepare(); 
    SDK.run(); //Does thing I don't know about 
} 

@Override 
SDKCallback(){ 

    startActivity(new Intent(this, MyActivity.class); 

} 


} 
+0

Können Sie den Code bitte posten? – varunkr

+0

Habe ich gerade, aber ich bin mir nicht sicher, ob es hilft. Das Problem kommt wirklich von der Interaktion zwischen Handler; Looper und der UI-Thread. – Laetan

Antwort

1

Sie müssen nicht Looper.prepare() nennen. Versuchen Sie diesen Code erstellen Handler,

new Handler(Looper.getMainLooper()) { 
    @Override 
    public void handleMessage(Message message) { 

    } 
}; 

Wenn Sie Looper.prepare() in Ihrem Arbeitsthread setzen, wird es Ihr erstes Crash-Problem lösen [der Faden Looper.prepare() nicht genannt]. Aber es ist nicht in UI-Thread, so dass Sie nicht weiter starten Activity.

Was dieser obige Code macht, ist die Erstellung des Handler im UI-Thread. So können Sie als nächstes Activity starten.

Bearbeiten: Versuchen Sie es.

@Override 
SDKCallback(){ 

    new Handler(Looper.getMainLooper()) { 
     @Override 
     public void handleMessage(Message message) { 
      startActivity(new Intent(MyService.this, MyActivity.class)); 
     } 
    }; 


} 
+0

kann ich nicht. Ich bin nicht derjenige, der den Handler erstellt. Das SDK hat und ich habe keinen Zugriff auf seinen Code. Gibt es eine Möglichkeit, den Looper zu ändern, den der Handler verwendet, ohne darauf zuzugreifen? – Laetan

+0

können Sie Ihren Code veröffentlichen. – Bob

+0

Ich aktualisierte meine Antwort. Erstellen Sie den Handler in SDKCallback und versuchen Sie es. @ Laetan – Bob

Verwandte Themen