2016-03-23 49 views
1

Android uygulamamda bir screencap özelliği çalıştırmak için bu kodları kullanıyorum, screencap'ı yakalayabilir ve bir kaç kez çalıştırdıktan sonra, kullanılacak bir bitmap'e dönüştürebilir. Uygulama daha yavaş oluyor ve neden hiçbir fikrim yokAndroid düzgün bir şekilde kapanıyor

Bu kodlar, sürekli ve devam eden işlemleri bellekte çalıştırıyor mu? Ve eğer öyleyse onları nasıl düzgün bir şekilde kapatırım?

Process process = Runtime.getRuntime().exec("su"); 
OutputStreamWriter outputStream = new OutputStreamWriter(process.getOutputStream()); 
outputStream.write("/system/bin/screencap -p\n"); 
outputStream.flush(); 
Bitmap screen = BitmapFactory.decodeStream(process.getInputStream()); 
outputStream.write("exit\n"); 
outputStream.flush(); 
outputStream.close(); 
+0

Böyle bir şey yapmamanın bir sebebi var mı? http://stackoverflow.com/a/5651242/608347 –

+2

Onlarla işiniz bitince işlemleri sonlandırmalısınız. 'Process.destroy(); '. Bu, onlarla ilişkili herhangi bir akışı da kapatacaktır. –

cevap

0

Eğer jdk 7 kullanıyorsanız Try-ile-kaynaklar yaklaşımı kullanabilirsiniz:

Process process = Runtime.getRuntime().exec("su"); 
try (OutputStream out = process.getOutputStream(); 
    InputStream in = process.getInputStream()) { 
    OutputStreamWriter outputStream = new OutputStreamWriter(out); 
    outputStream.write("/system/bin/screencap -p\n"); 
    outputStream.flush(); 
    outputStream.write("exit\n"); 
    Bitmap screen = BitmapFactory.decodeStream(in); 
} 

deneyin bloğun parantez içinde InputStream ve OutputStream koyarak, her iki akışları otomatik olarak kapanacaktır try bloğunun sonu.

Alternatif olarak Google Guava kitaplığını kullanabilirsiniz (harika, btw). İhtiyacınız varsa bu kodu gönderebilirim ancak buradaki sitelerinde (https://github.com/google/guava/wiki/ClosingResourcesExplained)

+0

İşlemi de bitirmek zorunda mıyım? –

+0

Bu İşlemi bitirdiğinizde öldürmek istediğinize inanıyorum. Evet. 'Işlem #') (yok –

İlgili konular