Witam,
Emulator Galaxy Nexus Android 4.2.2 API 17, RAM 1024MB.
Jest plik wielkości ok. 12Mb umieszczony w pakiecie obok klasy.
Plik zapisany samymi liczbami float w reprezentacji binarnej muszę przeszukać pod kątem pewnych wartości.
InputStream.available() pokazuje liczbę identyczną z wielkością pliku.
Odczyt jest prawidłowy do 45 tys. rekordów:
...
lat=82.0 lon=119.0 off=4.24
lat=82.0 lon=119.25 off=4.2
aż nagle pojawiają się błędne wartości:
lat=0.0 lon=2.390615180138138E-41 off=1.9509440872388158E-20
i spełnia się warunek zakończenia odczytu a wartości są z kosmosu bo tam są tylko współrzędne geograficzne i ofset wysokości.
Nie ma żadnego wyjątku.
Kod pracuje bezbłędnie na PC z tym samym plikiem (pakietem jar).
Nie ma optymalizacji aby się "skipnąć" (tu akurat mógłbym to zrobić bo dane są posortowane) bliżej poszukiwanych wartości i nie czytać od początku całego pliku ale nie o to chodzi bo jak ma czytać to ma czytać.
Na telefon nie wrzucałem tego by nie rozwalać sobie już działającej appki, też nie istorne bo środowisko testowe ma być tak samo funkcjonalne jeżeli chodzi o takie aspekty.
Wyglada mi to albo na brak rozumu (RAM?) lub jakieś ograniczenia w emulatorze Android SDK (zwróciłem uwagę że wirtualna maszyna po pewnym czasie restartuje co czyni ją do pewnych zastosowań dysfunkcjonalną) .
Puszczałem ten kod w oddzielnym wątku poza główną "aktywnością" ale tak samo kicha.
Pozdrawiam.
Poniżej kluczowe fragmenty kodu.
...
dobule latitude = 23.00;
InputStream is = this.getClass().getResourceAsStream("/sciezka/plik.dat");
DatFileReader reader = new DatFileReader(is);
Object[] record;
double lat,lon,off;
while (is.available() > 0) {
record = reader.read(); // wczytanie 3 x 4 bajty do 3 obiektów Float
lat = (Float) record[0];
lon = (Float) record[1];
off = (Float) record[2];
if(latitude > lat)
break;
}
}
...
return off;
}