Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务内线程-需要等待线程完成[Android]_Java_Android_Multithreading - Fatal编程技术网

Java 服务内线程-需要等待线程完成[Android]

Java 服务内线程-需要等待线程完成[Android],java,android,multithreading,Java,Android,Multithreading,我让我的应用程序通过SSH(使用JSch)连接到服务器,但是如果我在不等待结果返回的情况下发送命令,应用程序将无法跟上,并且在不等待的情况下发送下一个命令时,它将错过回复 我尝试过几种方法,例如使用对象来同步线程,以及使用wait()和notify(),但UI线程在执行此操作时保持冻结状态。和thread.join(),虽然有效,但由于在命令之间冻结,因此运行速度非常慢 长话短说,我需要等待服务器的回复,处理并绘制它,然后发送下一个命令 非常感谢您的帮助,因为这是对我的计算机项目的帮助D /

我让我的应用程序通过SSH(使用JSch)连接到服务器,但是如果我在不等待结果返回的情况下发送命令,应用程序将无法跟上,并且在不等待的情况下发送下一个命令时,它将错过回复

我尝试过几种方法,例如使用对象来同步线程,以及使用wait()和notify(),但UI线程在执行此操作时保持冻结状态。和thread.join(),虽然有效,但由于在命令之间冻结,因此运行速度非常慢

长话短说,我需要等待服务器的回复,处理并绘制它,然后发送下一个命令

非常感谢您的帮助,因为这是对我的计算机项目的帮助D


//处理SSH连接的我的服务过程的一个片段
公共字符串sendCommand(最终字符串命令){
完成=错误;
最终线程sshServiceThread=新线程(new Runnable(){
字符串sshPassword=null;
private volatile boolean running=true;
@凌驾
公开作废运行(){
(跑步时){
试一试{
session=jSch.getSession(用户名、主机、端口);
检查密码();
session.setPassword(sshPassword);
session.setConfig(“StrictHostKeyChecking”、“no”);
//TODO-删除此选项
Log.w(“调试”,“主机:+Host+”用户名:+Username+”密码:+Password);
Log.w(“安全”,“发布前删除此文件”);
session.connect();
channel=session.openChannel(“shell”);
DataOutputStream dataOut=新的DataOutputStream(channel.getOutputStream());
InputStream in=channel.getInputStream();
channel.connect();
//发送命令
Log.w(“命令”,“命令:”+命令);
dataOut.writeBytes(命令+”&&echo命令已完成“+”\r\n”);
dataOut.flush();
字节[]tmp=新字节[1024];
字符串replyLine=“”;
试一试{
while(true){
while(in.available()>0){
inti=in.read(tmp,0,1024);
if(i<0)
打破
字符串lastLine=replyLine;
replyLine=(新字符串(tmp,0,i));
如果(!replyLine.contains(&&echo thecommandwassfinished))){
if(replyLine.contains(“命令已完成”)){
字符串结果=最后一行;
Log.w(“结果”,结果);
答复=结果;
已同步(同步对象){
通知();
}
返回;
}
}
}
}
}捕获(异常){
Log.w(“异常”,异常);
}
}捕获(JSCHEException jschX){
Log.w(“异常”,jschX);
如果(jschX.toString()包含(“超时”)){
Log.w(“错误”,“IP地址不正确”);
Toast.makeText(getApplicationContext(),“无法连接到主机,请检查IP和连接。”,Toast.LENGTH_LONG).show();
}
如果(jschX.toString()包含(“身份验证失败”)){
Log.w(“错误”,“用户名/密码不正确”);
Toast.makeText(getApplicationContext(),“用户名/密码不正确”,Toast.LENGTH_LONG.show();
}
if(jschX.toString().contains(“ECONNRESET”)){
Toast.makeText(getApplicationContext(),“连接失败”,Toast.LENGTH_LONG.show();
}
}捕获(IOException异常){
Log.w(“异常”,异常);
}
}
}
void checkPassword(){
Log.w(“密码设置”,“密码:+sshsservice.Password”);
sshPassword=sshsservice.password;
}
});
sshServiceThread.start();
试一试{
已同步(同步对象){
syncObject.wait(3000);
}
}
捕获(异常){
Log.w(“异常”,异常);
}
完成=正确;
回复;
}
请参见

。。。如果您不确定要读多少行,因此希望 使用“while”,确保你在while内做些什么以防止1) 忙等待2)结束条件。例如:

while(!end)
{
控制台输出标记(32);
如果(consoleOutput.read()==0x03)end=true;//文本结束
其他的
{ 
consoleOutput.reset();
consoleOutput.readLine();
结束=假;
}
}
要从另一个线程处理输入输出,可以使用

请看下面的图片