2017-11-13 4 views
0

Ich möchte einen Aktivitätsindikator anzeigen, der angezeigt wird, wenn ich einen langen Prozess mache.Nativescript - ActivityIndicator funktioniert nicht für einen bestimmten Codeblock

Ich habe ein Modell beschäftigt Flagge zu wahren.

Ich rufe dann eine Methode, die eine Zusage zurückgibt - wenn die Versprechen Anrufe auflösen, setze ich dann die Besetzt-Flag in meinem 'then' Handler auf false.

Wenn ich auf die Auflösung des Versprechens warte, erwarte ich, dass die Aktivitätsanzeige-Animation angezeigt wird, aber nicht.

Ich überprüft und stellte sicher, dass die UI-Einrichtung korrekt ist und es funktioniert.

Die Arbeit, die getan wird, ist mit nativescript-Kalender-Plugin - ich bin ein paar Kalendereinträge hinzufügen.

Ich kommentierte die Arbeit, die getan wird, und ging nur für ein bisschen schlafen und rief dann resolve() und die Animation funktionierte.

Der Aktivitätsindikator und der Promise-Mechanismus sind also richtig eingerichtet - dieses Plug-In bewirkt, dass die AI nicht angezeigt wird.

Was könnte ein solches Verhalten verursachen?

Ich habe tatsächlich den Promise Arbeitscode bearbeitet - für etwa 1 Sekunde in den Ruhezustand versetzt und dann mit dem Kalender begonnen. Ich sehe die AI für 1 Sekunde und dann friert es ein.

So sieht es aus wie die Kalenderschreibvorgänge verursacht die KI zu frieren.

Ich war unter dem Verständnis, dass Promise Arbeit im Hintergrund getan wird und keine Vordergrundanimation bewirken sollte.

Antwort

0

Ich hatte ein ähnliches Problem bei der Verwendung von SQLite.

Da Sie nicht explizit angegeben haben, dass Sie den Kalender in einem Worker ausführen, nehme ich an, dass Sie ihn im UI-Thread (Hauptthread) behalten.

Eine große Menge an Arbeit im UI-Thread verursacht merkliche Verzögerungen/Verzögerungen. So rufen Sie zum Beispiel das Aktivitätskennzeichen auf und rufen dann einen Prozess auf, der den Thread maximiert. Der Prozess wird beendet, der Aktivitätsindikator wird auf dem Bildschirm gezeichnet, aber dann wird er sofort ausgeblendet, bevor er angezeigt wird, wenn der Prozess beendet ist.

Der ideale Weg, um dies zu lösen, ist das Verschieben des Kalenders schreibt Code in einen Arbeiter (multithread Ihre App) und auf Erfolgsmeldung deaktivieren Sie die Aktivität-Indikator.

+0

Ich mache den ganzen Kalender arbeiten in einem Versprechen. Mein Verständnis war, dass Versprechen asynchrone Operation erlaubt - also wird der Körper des Versprechens im Hintergrund verarbeitet ... aber es sieht so aus, als wäre das ein Missverständnis meinerseits. – dashman

+0

@dashman yep so mein Verständnis von Versprechen ist, dass es im Grunde Code in die Ausführungswarteschlange fügt, wenn es fertig ist. Standardmäßig ist js eine einzelne Thread-Sprache (wie andere populäre Sprachen). Wenn Sie Dinge in einem anderen Thread tun wollen, müssen Sie einen Arbeiter verwenden – Roland

Verwandte Themen