【问题标题】:android make an object from extends AsyncTask and send it to another activityandroid 从扩展 AsyncTask 创建一个对象并将其发送到另一个活动
【发布时间】: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;
                }
                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 类.. 或者使用其他东西,比如新线程。 请告诉我如何做到这一点以及我在哪里更改我的代码。

非常感谢大家。

【问题讨论】:

  • 一个异步任务实例只能使用/执行一次。
  • Asynctask 是一个线程,而不是一个对象。你不能发送它。
  • @FlorescuGeorgeCătălin 这是我们正在谈论的 Java - 除了原语之外的所有内容都是对象。线程是一个对象。绝对可以传递 AsyncTask 对象,但无法更新它执行的后台线程。

标签: android android-studio ssh android-asynctask


【解决方案1】:

AsyncTask 不是为您的用例而设计的。不管你能不能让它工作,你都不应该。

来自AsyncTask documentation

“AsyncTasks 应该理想地用于短操作(一些 最多几秒钟。)”

AsyncTask 旨在为一个操作运行一次,然后将信息返回给 UI。您可能应该指定您的 SSH 连接在服务中运行,并使用 Thread 和 ThreadPool 方法来处理这个问题。

【讨论】:

  • 是的,你绝对可以使用线程。这是一个很好的指南:developer.android.com/reference/java/lang/Thread.html
  • 这为您提供了创建线程的基础知识。您可以保留对创建的线程的引用,以便将其传递到您希望它去的地方。
  • 我不会讲太多细节,但基本上,你可以创建一个线程,然后在你的 run() 方法中有一个等待循环,基本上每 100 次检查任何新输入-500 毫秒。然后,无论您有 Th​​read 对象引用,您都可以使用您拥有的任何新信息更新输入。
  • 谢谢你,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;
                }
                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

您可以如下调用:

新的 sshconnection().execute;

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2015-07-20
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多