Saya memiliki proses yang dibuat sebagai berikut:
Process p = Runtime.getRuntime().exec(new String[]{"su"});
Dalam program saya, saya hanya ingin membuat proses ini sekali. Saya sedang mengembangkan aplikasi penjelajah file root untuk Android, dan setiap kali proses ini dibuat, perangkat Android akan meminta pengguna untuk memberikan izin root. Ini adalah operasi yang sangat lambat, dan karena ini adalah peramban file, maka akan sering memerlukan izin root. Jadi, saya telah memutuskan untuk membuat proses ini sekali dan menulis perintah ke OutputStream dengan cara berikut (stdin adalah OutputStream ini):
stdin.writeBytes(command + "\n");
Sebelum saya dapat membaca output dari perintah, saya perlu program saya menunggu hingga perintah yang ditulis oleh writeBytes
telah dihentikan. Saya telah mencoba p.waitFor()
, namun hal ini menyebabkan program tersebut berhenti bekerja. menggantung.
Inilah cara saya membaca byte dari InputStream:
int read;
String out = "";
stdout = p.getInputStream();
byte[] buffer = new byte[262144];
while (true) {
read = stdout.read(buffer);
out += new String(buffer, 0, read);
if (read < BUFF_LEN) {
//we have read everything
break;
}
}
Perhatikan bahwa meskipun metode read(buffer)
memblokir hingga data masukan tersedia, metode ini tidak memblokir dalam kasus ini karena dianggap telah mencapai akhir InputStream.
Saya telah mencoba untuk memasukkan hanya bagian yang relevan dari kode saya dalam posting ini, tetapi jika Anda ingin melihat seluruh kode sumber dari kelas di mana ini terkandung, lihat di sini: http://pastebin.com/t6JdWmQr.
Bagaimana saya bisa memastikan perintah telah selesai dijalankan sebelum membaca proses InputStream?