Unterstützung für Threads in der Mail.Ru Mail Android-Anwendung: Wir erreichen eine vollständige Synchronisation



    Themen oder Buchstabenketten in der Post sind eines der Merkmale, die Geeks und das Massenpublikum als Polarbilder betrachten. Geeks setzen sie aktiv ein. gewöhnliche Benutzer sind, wie unsere Umfragen zeigen, eher vorsichtig mit ihnen. Erstens, ungewöhnlich, und zweitens befürchten die Menschen, dass sie nicht in der Lage sein werden, die Ketten zu navigieren. Als wir die Threads in der Webversion von Mail.Ru Mail implementiert haben, haben wir uns an diese Herausforderung erinnert - und, wie uns scheint, den bequemsten und intuitivsten Gruppierungsalgorithmus gefunden, der sowohl für Geeks als auch für weniger fortgeschrittene Benutzer geeignet ist. Als Grundlage für die Arbeit an mobilen Threads haben wir das von Big Mail entwickelte System verwendet, da wir die Benutzer nicht verwirren und andere Logik ausführen wollten. Unsere Aufgabe aus Sicht des Produkts war es, sicherzustellen, dass sowohl Web-Threads als auch mobile Threads für den Benutzer gleich funktionieren. Aber viele Dinge mussten unter Berücksichtigung der Offline-Arbeit überarbeitet werden. Im Folgenden erfahren Sie, wie wir in der Mail.Ru Mail-Android-Anwendung Gespräche geführt haben, bei denen E-Mails auch bei einem Netzwerkausfall nicht verloren gehen (wie Sie dasselbe in der iOS-Anwendung tun können) Beiträge).



    Bei der mobilen Anwendung haben wir besonderen Wert auf eine stabile und unterbrechungsfreie Offline-Arbeit gelegt. Unser Ziel war es, es dem Benutzer zu ermöglichen, Nachrichten offline zu bearbeiten, zu verschieben, Tags zu setzen, mit E-Mails zu arbeiten und Aktionen mit ganzen Threads auszuführen - und wenn das Netzwerk angezeigt wird, werden Informationen über all diese Aktionen korrekt an den Server übertragen.

    Die häufigste Option zum Implementieren von Threads in E-Mail-Anwendungen ist das Gruppieren von Briefen auf dem Client selbst: Briefe werden herausgepumpt und dann in Ketten gesammelt. Diese Option deckt die meisten Standardsituationen ab, mit Ausnahme komplexer Fälle, darunter beispielsweise die korrekte Gruppierung von Buchstaben in Threads, wenn Sie offline arbeiten. Wir brauchten jedoch eine Lösung, die garantiert für alle Benutzer gut funktioniert. Wir wollten nicht auf Offline-Arbeit verzichten, da sich die Qualität des Produkts in schwierigen Situationen manifestiert. Bei den Usability-Tests wurde außerdem festgestellt, dass die Verwendung von Threads praktisch und cool ist. Gleichzeitig befürchteten viele, dass sie keine Buchstaben mehr im Postfach finden würden, wenn die Ketten intuitiv gruppiert würden. Daher haben wir besonderes Augenmerk auf den Offline-Betrieb der Anwendung gelegt: Damit werden alle Änderungen separat gespeichert und bei Bedarf im Hintergrund synchronisiert. Für den Benutzer sollte dies so aussehen: Er nimmt die Änderungen vor, und dann versteht die Anwendung selbst, wie und wann all dies an den Server gesendet werden muss.

    Die technische Seite der Synchronisation


    Mit dem von uns beschlossenen Ansatz war es also möglich, mit der Implementierung zu beginnen. Die Logik zum Gruppieren von Buchstaben in Ketten wurde für die große Webversion von Mail entwickelt. Wir mussten das Rad also nicht neu erfinden: In der Android-Anwendung haben wir nur denselben Algorithmus implementiert. Es gibt einen detaillierten Beitrag über Habr darüber, wie es entwickelt wurde und wie es sich von den Algorithmen unterscheidet, die andere Mail-Dienste verwenden, daher werde ich es im heutigen Artikel nicht im Detail beschreiben.

    Daher war es wichtig, dass alle Operationen mit Buchstaben im Rahmen unserer Logik korrekt ausgeführt werden. Wenn zum Beispiel Nachrichten verschoben oder gelöscht werden, sollten alle Zähler im Web und in der Anwendung die richtige (aktualisierte) Anzahl von Buchstaben im Thread anzeigen, alle Flags "Lesen", "Nicht gelesen" sollten aktualisiert und synchronisiert werden, bestimmte Threads sollten in einigen Ordnern nicht mehr angezeigt werden etc. Neben der korrekten Synchronisation war es wichtig, dass die Operationen an Briefen schnell abgeschlossen wurden. Wir haben die Geschwindigkeit mit einem Array von 200 Buchstaben in verschiedenen Threads und Ordnern getestet. In der ersten Version dauerte es 20 Sekunden - und die ganze Zeit musste der Benutzer warten. Das konnten wir natürlich nicht zulassen.

    Wir begannen nach dem Grund für diese Langsamkeit zu suchen. Anfangs gingen wir davon aus, dass SQL-Vorgänge die meiste Zeit in Anspruch nahmen, da sie von der Anzahl der Buchstaben abhängig waren: Während des Vorgangs mussten die Threads, Zähler, Ordner, der Buchstabe selbst usw. aktualisiert werden. In der Realität bestand der Engpass jedoch darin, übermäßig komplexe Indizes zu kopieren, anhand derer wir dann Daten aus dem Speicher auswählten. Es dauerte 70-80% der Zeit von diesen 20 Sekunden. Wir haben das Kopieren dieser Indizes entfernt sowie die Indizes für jede Operation neu erstellt, gepuffert und aktualisiert, nachdem die Operation am Ende der Transaktion abgeschlossen war. Infolgedessen erhielten wir anstelle von 20 Sekunden nur etwa 20-50 ms für die Indexwiederherstellungsoperation. Darüber hinaus haben wir Daten aus Index-Neuerstellungen entfernt, die sich gemäß unserer Geschäftslogik nicht ändern.

    Wir haben ziemlich einfache und schnelle Indizes, zum Beispiel für einen bestimmten Wert: markiert, nicht markiert, gelesen, ungelesen, nach Ordnerwert, nach Konto. Wenn der Wert von Statusoptionen endlich ist, werden Indizes schnell neu erstellt. Die Neuerstellung von auf Präfixbäumen basierenden Textindizes nimmt viel Zeit in Anspruch: Sie sind im Hinblick auf den verwendeten Speicher sehr umfangreich, und im Allgemeinen ist diese Struktur recht umständlich. Es ermöglicht Ihnen, den Suchvorgang zu beschleunigen, ist jedoch sehr komplex und ändert sich über einen langen Zeitraum. Dies sind Standardprobleme unterschiedlicher Strukturen und Datenverarbeitungsalgorithmen. Wo wir bei der Suche gewinnen wollen, verlieren wir natürlich beim Ändern dieser Daten.

    Zuerst haben wir versucht, verschiedene Implementierungen von Textindizes durchzuführen. Wir haben keinen merklichen Unterschied festgestellt und uns für diejenigen entschieden, die durch unsere Messungen schneller waren. Die gewünschten Zeitkennzahlen haben wir aber immer noch nicht erreicht. Dann beschlossen wir, auf die andere Seite zu gehen. Daten wie Betreffzeile, Absender usw. während des Betriebs mit dem Buchstaben nicht ändern. Sie können sich einfach weigern, komplexe Indizes neu zu erstellen, und sich auf diejenigen beschränken, die für die gekennzeichneten, nicht gekennzeichneten usw. Parameter verantwortlich sind, also schnell. Wir haben alle unnötigen Operationen abgebrochen, das, was nicht abgebrochen werden kann, optimiert und sofort um 50-60% synchronisiert.

    Aber wir haben auch nicht damit aufgehört - schließlich können Operationen gruppiert werden. Wenn Sie nicht versuchen, einen universellen Algorithmus zu erstellen, sondern ihn in endliche Varianten zerlegen und die Eingabedaten nach Operationstypen gruppieren, können Sie diese ohne Bedingungen oder unnötige Operationen mit der Datenbank ausführen. Wir haben die Vorgänge mit Flaggen, beweglichen Buchstaben usw. individuell optimiert und sie hängen nicht mehr von der übertragenen Datenmenge ab.

    Infolgedessen sieht der Benutzer eine schnelle Antwort, unabhängig davon, welche Art von Operation er durchgeführt hat und mit welchen Daten. Am Anfang haben wir die Messlatte für uns auf 100 ms gesetzt, aber wir sind auf die Einschränkungen von Android selbst gestoßen: Der Transaktionsmechanismus ist ziemlich langsam, und wenn Sie ihn nicht verwenden, erhalten wir einen Zwischenzustandsfehler. Ich musste die Anforderungen anpassen. Wir planten, dass der Vorgang aus Sicht des Benutzers nicht länger als 200-500 Millisekunden dauern würde. Höchstwahrscheinlich werden wir in der nächsten Version von Android weiterhin sicherstellen, dass Vorgänge für den Benutzer fast sofort ausgeführt werden.

    Schnittstelle


    Wie bereits erwähnt, hat die Mail-Android-Anwendung die Logik der Anzeige von Threads aus der Webversion übernommen. Bei der Implementierung der Benutzeroberfläche gibt es natürlich Unterschiede: Der Bildschirm eines Smartphones und sogar eines Tablets ist viel kleiner als der eines Desktops, und es musste entschieden werden, wie Threads darauf angezeigt werden sollen.



    Zunächst haben wir zwischen zwei Optionen gewählt. Die erste ist eine zweistufige Anzeige (eine Liste von Threads und eine Thread-Ansicht in Kombination mit dem Lesen eines Buchstabens). Zuerst schien er logisch und uns vorzuziehen. Nachdem wir diese Implementierung in anderen Anwendungen getestet hatten, waren wir enttäuscht: Die Anzeige von Threads auf zwei Bildschirmen erwies sich in allen Fällen als recht unpraktisch. Aus diesem Grund haben wir die Option mit drei Ebenen gewählt (Liste der Themen, Anzeigen von Buchstaben in diesem Thema, Öffnen und Lesen von Buchstaben). In diesem Fall hat der Benutzer die Möglichkeit, sich die Überschriften anzusehen und auszuwählen, welche Buchstaben er öffnen möchte.

    Aufgrund der Tatsache, dass die Nachrichten innerhalb des Threads dieselben Themen haben, werden sie gruppiert und es gibt eine Stelle auf dem Bildschirm, an der detailliertere Snippets angezeigt werden können. Im Allgemeinen hat sich dies als praktischer herausgestellt: Wenn Sie sich daran erinnern müssen, was in einer langen Korrespondenz besprochen wurde, können Sie diese mit Buchstabenschnipsel im Speicher aktualisieren oder schnell zum gewünschten Buchstaben scrollen und die Korrespondenz von der Stelle aus lesen, an der sich etwas Wichtiges befindet.

    Ein weiterer Unterschied zwischen dem Big Web und der Anwendung betrifft die Position neuer Buchstaben im Thread. In der Webversion erfolgt dies in zwei Bildschirmen, da der Browser über die Position dieser Informationen verfügt. Das Web zeigt immer den Thread an und öffnet entweder den letzten ungelesenen Buchstaben oder den obersten Buchstaben aus diesem Ordner. Anschließend können Sie alle Buchstaben auf einem Bildschirm reduzieren und erweitern. In der Android-Anwendung „versagt“ der Benutzer im Moment immer entweder im Thread oder beim Lesen des Briefes (wenn die Konversation nur einen Buchstaben enthält). Zwischen den Buchstaben im Faden können Sie sich auf dem Wisch nach links oder rechts bewegen.

    Unabhängig davon lohnt es sich, über die Symbolleiste zu sprechen, die sich auf den gesamten Thread bezieht. Hier weist Android Mail mehr Unstimmigkeiten mit der Webversion auf. In letzterem Fall ist die Symbolleiste ein großes Bedienfeld, in dem Sie Vorgänge mit dem oberen Buchstaben des Threads im Ordner ausführen können. In der Android-Anwendung Mail.Ru Mail wird entweder mit der gesamten Kette oder mit bestimmten vom Benutzer ausgewählten Buchstaben gearbeitet. Es gibt nur eine Ausnahme: Wenn mit einem Thread gearbeitet wird, besteht die Möglichkeit, den letzten Buchstaben in dieser Kette zu beantworten. Dies ist einer der relativ häufigen und wichtigen Fälle. Daher haben wir diese Schaltfläche aus dem Lesen des Buchstabens entfernt und in die Tools für die Arbeit mit dem Thread aufgenommen. Die Schaltflächen "Antworten" und "Weiterleiten", die als Hauptaktionsschaltflächen für den Thread bezeichnet werden können, gelten genau für den letzten Buchstaben der Kette.

    Interaktion mit Android Wear und Android Auto


    Wir haben zunächst die Unterstützung für Android Wear und Android Auto implementiert, sodass für die Interaktion mit Android Mail mit der Uhr und dem Radio keine zusätzlichen Maßnahmen erforderlich waren. Wenn der Benutzer die Gruppierung von Buchstaben in den E-Mail-Einstellungen aktiviert hat, werden Benachrichtigungen auf der Uhr auch nach Thread gruppiert. Wenn das Gruppieren von Buchstaben deaktiviert ist, funktioniert alles wie zuvor und Benachrichtigungen werden nicht gruppiert. Im Android Auto-Radio werden Benachrichtigungen auch nach Threads gruppiert.

    Wir haben die Aufgaben unserer Meinung nach gemeistert. Aber wie immer erwarten wir wirklich Feedback von Ihnen. Testen Sie Threads auf Android und teilen Sie uns mit, ob dies für Sie praktisch ist.

    Jetzt auch beliebt: