android 从扩展 AsyncTask 创建一个对象并将其发送到另一个活动
Posted
技术标签:
【中文标题】android 从扩展 AsyncTask 创建一个对象并将其发送到另一个活动【英文标题】:android make an object from extends AsyncTask and send it to another activity 【发布时间】:2017-03-09 09:22:28 【问题描述】:我从 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;
tryThread.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 类.. 或者使用其他东西,比如新线程。 请告诉我如何做到这一点以及我在哪里更改我的代码。
非常感谢大家。
【问题讨论】:
一个异步任务实例只能使用/执行一次。 Asynctask 是一个线程,而不是一个对象。你不能发送它。 @FlorescuGeorgeCătălin 这是我们正在谈论的 Java - 除了原语之外的所有内容都是对象。线程是一个对象。绝对可以传递 AsyncTask 对象,但无法更新它执行的后台线程。 【参考方案1】:AsyncTask 不是为您的用例而设计的。不管你能不能让它工作,你都不应该。
来自AsyncTask documentation:
“AsyncTasks 应该理想地用于短操作(一些 最多几秒钟。)”
AsyncTask 旨在为一个操作运行一次,然后将信息返回给 UI。您可能应该指定您的 SSH 连接在服务中运行,并使用 Thread 和 ThreadPool 方法来处理这个问题。
【讨论】:
是的,你绝对可以使用线程。这是一个很好的指南:developer.android.com/reference/java/lang/Thread.html 这为您提供了创建线程的基础知识。您可以保留对创建的线程的引用,以便将其传递到您希望它去的地方。 我不会讲太多细节,但基本上,你可以创建一个线程,然后在你的 run() 方法中有一个等待循环,基本上每 100 次检查任何新输入-500 毫秒。然后,无论您有 Thread 对象引用,您都可以使用您拥有的任何新信息更新输入。 谢谢你,Shadesblade 先生 .. 我找到了你之前给我的解决方案 .. 我读到了它,我找到了解决方案 .. 我现在将发布解决方案。【参考方案2】:我找到了解决办法
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;
tryThread.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
您可以如下调用:
新的 sshconnection().execute;
【讨论】:
以上是关于android 从扩展 AsyncTask 创建一个对象并将其发送到另一个活动的主要内容,如果未能解决你的问题,请参考以下文章