我有从sshconnection创建一个扩展AsyncTask类的对象的问题..
我的课程如下
public class sshconnection extends AsyncTask<String, Void, String> {
ByteArrayOutputStream baos;
protected String doInBackground(String... params) {
try {
String results;
JSch jsch = new JSch();
Session session = jsch.getSession(User, IP, Port);
session.setPassword(Pass);
// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
session.connect();
ChannelExec channel = (ChannelExec)session.openChannel("exec");
InputStream in = channel.getInputStream();
baos = new ByteArrayOutputStream();
channel.setOutputStream(baos);
channel.setCommand(CMD);
channel.connect();
byte[] tmp=new byte[1024];
while(true){
while(in.available()>0){
int i=in.read(tmp, 0, 1024);
if(i<0)break;
System.out.print(new String(tmp, 0, i));
}
if(channel.isClosed()){
System.out.println("exit-status: "+channel.getExitStatus());
break;
}
try{Thread.sleep(1000);}catch(Exception ee){}
}
channel.disconnect();
session.disconnect();
return baos.toString();
} catch (Exception e) {
//Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
//System.out.println(e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(String result) {
// TextView txt = (TextView) findViewById(R.id.txtipinfo);
// txt.setText("Executed");
Toast.makeText(MainActivity.this, baos.toString(), Toast.LENGTH_LONG).show();
}
}
这是我点击按钮时调用它
btn = (Button) findViewById(R.id.button_conn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CMD = "ls";
new sshconnection().execute(User,Pass,IP,CMD);
}
});
在此之前,我的代码工作正常,我可以与服务器建立ssh连接。
我的问题是我想从sshconnection类创建一个对象,将其发送到另一个活动,重用ssh的连接,将其他ssh命令发送到我的服务器。
如果有其他方法可以做到这一点,即使我必须更改AsyncTask类..或者使用anthing else像新线程一样。 请告诉我如何操作以及我在代码中进行更改的位置。
非常感谢大家。
答案 0 :(得分:2)
AsyncTask不是为您的用例而设计的。无论你是否能让它发挥作用,你都不应该。
“理想情况下,AsyncTasks应该用于短期操作(少数 最多几秒钟。)“
AsyncTask旨在为一个操作运行一次,然后将信息返回给UI。您可能应该指定要在服务中运行的SSH连接,并使用Thread和ThreadPool方法来处理此问题。
答案 1 :(得分:0)
我找到了解决方案
public class sshconnection extends AsyncTask<String, Void, String> {
public String returncmd=null;
ByteArrayOutputStream baos;
protected String doInBackground(String... params) {
try {
//Sndlist=args[0];
//result=-11;
//String results;
JSch jsch = new JSch();
Session session = jsch.getSession("admin", "10.0.0.1",22);
session.setPassword("a");
//Toast.makeText(null," user = " + ss, Toast.LENGTH_SHORT).show();
// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
session.connect();
ChannelExec channel = (ChannelExec)session.openChannel("exec");
InputStream in = channel.getInputStream();
baos = new ByteArrayOutputStream();
channel.setOutputStream(baos);
channel.setCommand("/ip hotspot user add name=nnnnnn profile=120");
channel.connect();
byte[] tmp=new byte[1024];
while(true){
while(in.available()>0){
int i=in.read(tmp, 0, 1024);
if(i<0)break;
System.out.print(new String(tmp, 0, i));
}
if(channel.isClosed()){
System.out.println("exit-status: "+channel.getExitStatus());
break;
}
try{Thread.sleep(1000);}catch(Exception ee){}
}
channel.disconnect();
session.disconnect();
returncmd = baos.toString();
return returncmd;
} catch (Exception e) {
//Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
//System.out.println(e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(String result) {
// TextView txt = (TextView) findViewById(R.id.txtipinfo);
// txt.setText("Executed");
//mProgressDialog.dismiss();
//Toast.makeText(UserDetail.this, baos.toString(), Toast.LENGTH_LONG).show();
}
} // end of class sshconnection
您可以按以下方式致电:
new sshconnection()。execute;