2012-07-24 13 views
6

Jaki jest najlepszy sposób na zachowanie List<String[]> podczas mojej aplikacji? Mam problemy z moim podejściem. Przez większość czasu pojawia się błąd OutOfMemory, ponieważ lista jest zbyt duża.Android, jak zachować dużą listę <String[]> podczas pracy aplikacji

List<String[]> jest wynikiem parsowania pliku csv, który pobrałem online. Co mogę zrobić, to zanalizować CSV działalność następnie zapisać swój wynik w statycznym członka klasy jak:

String url = "http://xxx/pdf/pms/pms_test.csv"; 
try { 
    InputStream input = new URL(url).openStream(); 
    CSVReader reader = new CSVReader(new InputStreamReader(input)); 
    SchedController.sched = reader.readAll(); 
    input.close(); 
} 

... wtedy dostęp ClassName.sched na różnych działaniach.

Robię to, aby przeanalizowane dane były dostępne w każdym działaniu ... I nie muszę ponownie analizować. Co mogę zrobić, aby to poprawić?

+1

powinien mieć zastosowanie mechanizm stronicowania z „Ładowanie Więcej ...” funkcjonalność. Pomoże Ci również osiągnąć płynność i szybkość. –

+1

Czy korzystanie z usługi i przekazywanie danych między usługami i działaniami może pomóc? – Gogu

+0

Czy przechowujesz przeanalizowane wartości w 'Kolekcji' jak' HashTable' lub 'ArrayList'? – Abhilasha

Odpowiedz

1

Myślę, że możesz mieć 2 podejścia.

  1. zapisać pliki przetwarza go w leniwe załadunku sposób
  2. utworzyć bazy i zapisać dane.

Proponuję utworzyć bazę danych, nie jest to trudne i pozwala dobrze zarządzać swoimi danymi. Możesz łatwo wykonać lazyLoading za pomocą kursora lub użyć ORM (ORMLite/Greendao) ... Myślę, że to najlepszy i najszybszy sposób na załadowanie twoich danych.

Mam nadzieję, że to ci pomoże.

+0

Z tego, co rozumiem, leniwy ładowanie działa dobrze, gdy nie musisz pobierać i wyświetlać wszystkiego od razu ... ale w moim przypadku, przechodzenie przez cały plik CSV ma kluczowe znaczenie, ponieważ wyniki, których potrzebuję, są oparte na harmonogramie obecność w pliku. Jednak postaram się przeczytać o tworzeniu dla niego bazy danych. Chciałbym, żeby to nie było trudne. Pomyślałem o tym za pierwszym razem, gdy zobaczyłem plik csv, ale użyłem podejścia, które powiedziałem powyżej zamiast tego ... – yojoannn

+0

To trochę pracy, ale nie będziesz tego żałować;) – AMerle

1

Wystarczy dodać komentarz Paresha. Mogę zasugerować coś podobnego, którego używałem w mojej aplikacji.

Na przykład potrzebuję wyświetlić listę towarów w sklepie. (Każda pozycja będzie miała ID, imię i koszt).

Aby to osiągnąć, najpierw wysyłam żądanie do serwera, aby uzyskać liczbę pozycji, na przykład itemCount. Teraz ustawiam ograniczenie liczby pozycji wyświetlanych na stronie, powiedzmy 100. Jeśli wartość pozycji jest większa niż 100, wyświetlam komunikat informujący, że zostanie wyświetlonych tylko 100 pozycji, a następny button może zostać dodany, aby pobrać następny zestaw przedmiotów. Lub jeśli jest to wyszukiwanie, możesz poprosić użytkownika, aby wrócił i zawęził wyszukiwanie. Jeśli ITEMCOUNT jest mniejsza niż 100, wtedy nie będzie miał żadnych problemów

ten sposób stronicowania mogą być wdrożone w celu uniknięcia OutOfMemory problemy

+0

Ah ... Myślę, że nie mogę zrób to (nie bardzo pewnie ..) Widzisz, moja aplikacja zwraca szczegóły harmonogramu, które są sformatowane w pliku csv. Za każdym razem, gdy szukam harmonogramu, muszę przejść przez cały CSV, aby zwrócić właściwe wyniki. Ponadto, klient wymaga, aby aplikacja była użyteczna, nawet jeśli jest offline ... – yojoannn

+1

Wtedy domyślam się, że wszystko wczytuję raz, parsowanie i zapisywanie w bazie danych jest lepsze niż przechowywanie wszystkiego w pamięci runtime (co powoduje OutOfMemory). I dostęp do niej, gdy potrzebne do wyświetlenia. Może podczas projektowania bazy danych można kategoryzować dane w wielu tabelach, tak aby nie spędzać zbyt wiele czasu na filtrowaniu go. W ten sposób aplikacja może działać, nawet jeśli jest _offline_ – Abhilasha

+0

zgadnij też ... Dzięki za poświęcony czas! :) – yojoannn