Sunucudan görüntü indirmek ve listview olarak göstermek için kullanılan bir uygulama oluşturmaya çalışıyorum. Yaptığım sorun, bellek sızıntısıydı ve uygulamamın çökmesine neden oldu. Android blogunda bu link gibi arama yapıyordum, bu harika bir fikir ama yine de birden fazla iş parçacığı ile yapmak için yeterli değil. Android'in bazı aygıtları bununla çalışabilir, ancak bazı aygıtlar yalnızca tek iş parçacığında işleyebilir ve bazen hiç çalışamaz.Sunucudan resim indir ve BitmapFactory kullanmadan sdcard'a kaydet
Uygulamamın birçok etkinliği var ve her birinin görüntüyü olabildiğince hızlı görüntülemesi gereken bir Liste Görünümü var. Google IO 2012 sayesinde orijinal görüntüyü SD karta kaydetmek için arabellek kullanırlar ve Leak belleği sorununu çözer, ancak indirmesi gereken görüntü çok büyük olduğundan yükleme yavaşlatır.
Soruma soru sormak istiyorum: Görüntüyü SD karta yazma görüntüsüyle birlikte ölçeklendirmenin herhangi bir yolu var mı? Bazı olası çözüm, giriş akışı nesnesinde Atlama baytını kullanmanın bir yolunu bulmaya çalışıyorum ve görebilmem için resmin Genişlik ve Yüksekliğini de buldum.
Aşağıdaki kod Google IO 2012'de kullanıldı ve çok sayıda iş parçacığıyla iyi çalışıyor, benim durumumda arka planda 4 iş parçacığı var.
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();
}
}
Cevabınız için teşekkür ederim, bu durumda zaten vardı, ancak JNI'nin daha fazla bellek ayırmasına izin vermeyen bazı aygıtlar için birden fazla iş parçacığı ile hala bellek sızıyor. Google IO 2012'nin kodu, tüm cihazları destekleyen birden fazla iş parçacığı ile çalışmasını sağlayabilir, ancak görüntünün çok büyük olması durumunda bu kadar yavaştır. Her nasılsa kullanıcı hızlı bir şekilde aktivitede geziniyor, bu yüzden ilk kez yükleme yapıyor, hiç de iyi değil. – vsatkh