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 毫秒。然后,无论您有 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;
                
                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 创建一个对象并将其发送到另一个活动的主要内容,如果未能解决你的问题,请参考以下文章

Android:从 AsyncTask 请求位置权限

android创建子线程

使用扩展语法创建一系列自然数

android 如何创建一张透明bitmap

Android O:AsyncTask分析

Android O:AsyncTask分析