Próbuję utworzyć aplikację, która służy do pobierania obrazu z serwera i wyświetlania go w widoku listy. Problem, który stworzyłem, to wyciek pamięci i awarie mojej aplikacji. Szukałem na blogu z Androidem, takim jak ten link, to świetny pomysł, ale wciąż nie wystarczy, aby zrobić to z wieloma wątkami. Niektóre urządzenia z Androidem mogą z nim pracować, ale niektóre urządzenia mogą obsługiwać tylko jeden wątek, a czasami nie działają w ogóle.Pobierz obraz Androida z serwera i zapisz na sdcard bez użycia BitmapFactory
Moja aplikacja ma wiele działań, a każda z nich ma ListView, która wymaga możliwie szybkiego wyświetlania obrazu. Za pośrednictwem Google IO 2012 używają bufora do zapisania oryginalnego obrazu na karcie SD i rozwiązuje problem nieszczelności pamięci, ale powoduje, że ładowanie jest tak wolne, ponieważ obraz, który trzeba pobrać, był zbyt duży.
Moje pytanie brzmi: Czy istnieje sposób skalowania obrazu wraz z obrazem zapisanym na karcie SD? Domyślam się, że możliwe jest użycie Skip Byte w obiekcie inputstream i udało mi się znaleźć szerokość i wysokość również bit na piksel obrazu, który muszę pobrać.
Następujący kod był używany w Google IO 2012 i działa dobrze z wieloma wątkami, w moim przypadku mam 4 wątki działające w tle.
private void downloadAndWriteFile(final String url, final File file) throws OutOfMemoryError {
BufferedOutputStream out = null;
try {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setDoInput(true);
conn.connect();
final InputStream in = new BufferedInputStream(conn.getInputStream(), IO_BUFFER_SIZE_BYTES); // buffer size 1KB
out = new BufferedOutputStream(new FileOutputStream(file), IO_BUFFER_SIZE_BYTES);
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
out.close();
conn.disconnect();
}
catch (Exception e) {
Log.e(TAG, "!!downloadAndWriteFile " + e.getMessage());
file.delete();
}
}
Dzięki za odpowiedź, już przeszedłem przez ten przypadek, ale wciąż otrzymuję pamięć o wycieku z wieloma wątkami dla niektórych urządzeń, które nie pozwalają JNI przydzielić więcej pamięci. Kod Google IO 2012 może sprawić, że będzie działał z wieloma wątkami obsługującymi wszystkie urządzenia, ale będzie tak powolny, jeśli obraz będzie zbyt duży. W jakiś sposób użytkownik nawiguje szybko, więc przy pierwszym ładowaniu nie jest wcale dobry. – vsatkh