W mojej aplikacji muszę wdrożyć niektóre usługi interfejsu użytkownika i synchronizacji. Działa w tle i aktualizuje dane. Usługa synchronizacji nie jest bardzo prosta, korzysta z wielowątkowości.Co powiesz na wielowątkowość w Android SQLite?
Tak, oto moja historia: Kiedy zacząłem rozwijać tę aplikację, nie wiedziałem nic o sqlite, więc po prostu nie używałem żadnej synchronizacji wątków w Javie. Wynik: Mam wiele wyjątków, takich jak "SQLiteException: baza danych jest zablokowana: BEGIN EXCLUSIVE;"
Następnie zsynchronizowałem wszystkie moje transakcje za pomocą zwykłego bloku synchronizacji Java() {}. Wszystko stało się znacznie lepsze. Ale użyłem Cursors do implementacji CursorAdapter dla moich list. Czasami otrzymywałem ten sam "SQLiteException: baza danych jest zablokowana: BEGIN EXCLUSIVE;"
Zakończyłem tworzenie małego wątku bezpiecznego narzędzia sqlite, które obsługuje wszystkie rzeczy bezpieczne dla wątków. Muszę też użyć czegoś takiego jak ArrayAdapter (odczytaj wszystkie dane z kursora i zamknij je po odczytaniu, także zsynchronizuj ten blok) dla mojego interfejsu użytkownika. Tak więc działa OK
Ale nie podoba mi się taki sposób obsługi interfejsu użytkownika, ponieważ interfejs użytkownika stał się naprawdę wolniejszy dzięki temu rozwiązaniu - odczytanie pewnej ilości danych z kursora jest raczej szybkie, ale jest wolniejsze niż użycie CursorAdapter
Kto ma rozwiązanie tego pytania? Dziękujemy
Jak masz na myśli UI dostał wolniej? Czy odpowiedź na dotknięcia itp. Trwa dłużej? Czy po prostu dłużej wyświetlasz dane z bazy danych? Jeśli właśnie czytasz bazę danych, nie używaj transakcji - pozwala to na jednoczesne wykonywanie wielu odczytów z bazy danych. –
@Joseph Earl Miałem na myśli "dłużej wyświetlać dane". i tak, nie używam transakcji podczas odczytu danych. Używam ich tylko wtedy, gdy piszę jakieś dane. –