android从扩展AsyncTask创建一个对象并将其发送到另一个活动

时间:2016-10-26 20:55:08

标签: android android-studio ssh android-asynctask

我有从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像新线程一样。 请告诉我如何操作以及我在代码中进行更改的位置。

非常感谢大家。

2 个答案:

答案 0 :(得分:2)

AsyncTask不是为您的用例而设计的。无论你是否能让它发挥作用,你都不应该。

来自AsyncTask documentation

  

“理想情况下,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;