mboost-dp1

Java problem 1: commandline check


Gå til bund
Gravatar #1 - Qw_freak
11. jun. 2012 10:36
Jeg har en metode som skal skrive en commando til "commando linien" i android.

Mit problem er at jeg mangler en måde at tjekke om der kommer noget tilbage som svar på mit input..

som det er nu, fortæller jeg min metode om jeg forventer et output , men selvom jeg forventer det, kan der jo godt gå noget galt så der intet kommer ud..

Så, er der nogen der har en ide til hvordan jeg kan lave et tjek, så readLine() ikke kommer til at hænge hvis noget går galt og der ikke kommer et output.

*NOTE, readLine() venter (forevigt) på at der kommer noget, hvilket der jå åbenlyst ikke altid gør efter en indtastning i commandolinien...

Kode:
package rose.mymedic2.connectiontoggle;

import java.io.DataInputStream;
import java.io.DataOutputStream;

import android.util.Log;

public class RunCommand {
/**
* @param Command
* To be run as super user.
* @param ExpectOutput
* Expects no output if false. If true, this method expects
* output.
* @return
*/
public static String RunSuperUserCommand(String Command) {
return RunSuperUserCommand(Command, false);
}

public static String RunSuperUserCommand(String Command, boolean ExpectOutput) {
Process suProcess;
DataInputStream osRes;
DataOutputStream os;

ExpectOutput = false;
String Output = null;

try {
suProcess = Runtime.getRuntime().exec("su");
os = new DataOutputStream(suProcess.getOutputStream());
osRes = new DataInputStream(suProcess.getInputStream());

if (null != os && null != osRes) {
// running the command.
os.writeBytes(Command + "\n");
os.flush();

if (ExpectOutput) {
Output = osRes.readLine();
}

os.writeBytes("exit\n");
os.flush();

}
} catch (Exception e) {
Log.d( Command ,"Error [" + e.getClass().getName() + "] : "
+ e.getMessage());
}
return Output;
}

}
Gravatar #2 - plazm
11. jun. 2012 11:16
Er det ikke bare at sætte et async read op, vente på at processen bliver færdig og når den gør det skrive det ud som din async read har fået og lukke den pænt ned igen?
Gravatar #3 - arne_v
11. jun. 2012 11:20
#1

readLine bør ikke vente forever. Den bør returnere når processen er færdig.
Gravatar #4 - Qw_freak
11. jun. 2012 11:21
plazm (2) skrev:
Er det ikke bare at sætte et async read op, vente på at processen bliver færdig og når den gør det skrive det ud som din async read har fået og lukke den pænt ned igen?

hvad så hvis der aldrig kommer svar?
Gravatar #5 - arne_v
11. jun. 2012 11:22
#1

Hvad laver DataInputStream og DataOutputStream her?

De er til at læse og skrive binære data med.

BufferedReader og PrintWriter var nok bedre egnet.
Gravatar #6 - arne_v
11. jun. 2012 11:22
arne_v (3) skrev:
Den bør returnere når processen er færdig.


Eller smide en Exception.
Gravatar #7 - plazm
11. jun. 2012 11:23
Qw_freak (4) skrev:
hvad så hvis der aldrig kommer svar?

Så vil du kunne cancel det async read og all is good, det er selvfølgelig med den forventning at man altid ved om en process er færdig/fejlet
Gravatar #8 - Qw_freak
11. jun. 2012 11:24
arne_v (3) skrev:
#1

readLine bør ikke vente forever. Den bør returnere når processen er færdig.


hvis jeg exemplvis laver en cd.. kommer der ikke noget output som readline() kan læse, og så venter den bare indtil der kommer noget... så vidt jeg kan se...
Gravatar #9 - arne_v
11. jun. 2012 12:27
#8

Den bør returnere eller smide Exception. når processen stopper.

Men for at være praktisk forudsætter det at du ikke genbruger processen til flere kommandoer.

Gravatar #10 - arne_v
11. jun. 2012 12:34
#9

Hvis du har brug for multiple kommandoer i samme process, så må ideerne være i prioriteret rækkefølge:

1) skift design så du ikke har det behov
2) lav noget C kode der gør som du vil og kald det via JNI
3) lav read i en separat tråd

Gravatar #11 - arne_v
11. jun. 2012 13:21
#10

Du kunne evt. søge lidt i comp.lang.java.programmer efter timeout read.

Vi havde en lang tråd for ikke så lang tid siden.
Gravatar #12 - Qw_freak
12. jun. 2012 10:31
jeg løste det ved at smide en if sætning omkrin readline() som trigger på available(). så den kun læser hvis der er noget...
er det en grim løsning?

Kode:
if (ExpectOutput && (osRes.available() >= 1)) {
Output = osRes.readLine();
}
Gravatar #13 - arne_v
12. jun. 2012 10:52
#12

Det er en løsning som kun virker hvis kommandoen genererer output og den naar at blive laest ind i buffer inden du kalder available.

Ikke specielt robust.

Og generelt er available en noget tvivlsom metode. Hvis der er noget i buffer, saa er det nyttigt at vide. Men hvis der ikke er noget i buffer, så kan man ikke bruge det til meget.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login