2017-08-18 5 views
0

Ich bin neu in AsyncTask und das ist das erste Mal, dass ich es benutze. Was ich versuche zu erreichen, ist folgendes: Ich möchte eine Aktivität haben, die eine Schaltfläche und eine Textansicht hat. Wenn ich den Knopf drücke, macht die App eine SSH-Verbindung im Hintergrund und verbindet sich mit meinem Raspberry Pi. Es führt ein paar Python-Skripte aus und lädt sie in Dropbox hoch.Was sind die Parameter in asynctask in diesem Fall?

Wenn es fertig ist, warnt die Textansicht, dass ich meine Datei in Dropbox finden kann, da der Upload abgeschlossen war. Wenn ich recht habe, sollte ich nichts in die AsyncTask-Parameterliste schreiben oder soll ich?

Abgesehen von der Argumentliste, gibt es auf meinem Code mehr zu tun?

Vielen Dank im Voraus!

public class Aszin extends AppCompatActivity { 

String cmd = "python /home/pi/Desktop/get_db_pic.py"; 
private static String USERNAME = "piro"; // username for remote host 
private static String PASSWORD = "password"; // password of the remote host 
private static String host = "192.168.xx.xx"; // remote host address 
private static int port = 22; 

TextView tv1; 
Button btn_ssh; 
private AsyncTask<String, Integer, ???> asyncTask; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_aszin); 

    tv1 = (TextView) findViewById(R.id.tv1); 
    tv1.setText("default"); 

    btn_ssh = (Button) findViewById(R.id.btn1); 
    btn_ssh .setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      connect2pi(cmd); 
     } 
    }); 

} 

public void connect2pi(final String cmd){ 
    asyncTask = new AsyncTask<String, Integer, ??>() { 

     @Override 
     protected void doInBackground() { 
      List<String> result = new ArrayList<String>(); 
      try { 
       JSch jsch = new JSch(); 
       Session session = jsch.getSession(USERNAME, host, port); 

       session.setConfig("StrictHostKeyChecking", "no"); 
       session.setPassword(PASSWORD); 

       session.connect(); 

       ChannelExec channelExec = (ChannelExec) session.openChannel("exec"); 

       InputStream in = channelExec.getInputStream(); 

       channelExec.setCommand(cmd); 
       channelExec.connect(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 

       String line; 
       while ((line = reader.readLine()) != null) { 
        result.add(line); 

       } 
       channelExec.getExitStatus(); 

       channelExec.disconnect(); 

       session.disconnect(); 

      } catch (Exception e) { 
       System.err.println("Error: " + e); 
      } 
     } 


     @Override 
     protected void onPostExecute(JSONObject result) { 
      super.onPostExecute(result); 
      tv1.setText("your file has been downloaded"); 
      btn_ssh.setEnabled(true); 

     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      tv1.setText("your file is getting downloaded"); 
      btn_ssh.setEnabled(false); 

     } 

    }; 
    asyncTask.execute(cmd); 

} 
} 
+0

Werfen Sie einen Blick auf [Dies] (https://stackoverflow.com/a/29559386/6950238) Antwort –

Antwort

1

Die Parameter für AsyncTask sind die folgenden:

AsyncTask<doInBackgroundParams, onProgressUpdateParams, onPostExecuteParams> 

In Ihrem Fall sind Sie nicht nicht mit onProgressUpdate und doInBackground so können Sie es als Void verlassen. Sie füllen einen ArrayList<String> result in doInBackground und möchten wahrscheinlich die Werte in onPostExecute so verwenden, dass der Wert ArrayList<String> wäre. Wenn nicht, lassen Sie es als Void. Am Ende sieht es aus wie dieses

asyncTask = new AsyncTask<Void, Void, Void>() { 

    @Override 
    protected void doInBackground(Void... params) { 
     List<String> result = new ArrayList<String>(); 
     try { 
      JSch jsch = new JSch(); 
      Session session = jsch.getSession(USERNAME, host, port); 

      session.setConfig("StrictHostKeyChecking", "no"); 
      session.setPassword(PASSWORD); 

      session.connect(); 

      ChannelExec channelExec = (ChannelExec) session.openChannel("exec"); 

      InputStream in = channelExec.getInputStream(); 

      channelExec.setCommand(cmd); 
      channelExec.connect(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 

      String line; 
      while ((line = reader.readLine()) != null) { 
       result.add(line); 

      } 
      channelExec.getExitStatus(); 

      channelExec.disconnect(); 

      session.disconnect(); 

     } catch (Exception e) { 
      System.err.println("Error: " + e); 
     } 
    } 


    @Override 
    protected void onPostExecute(Void param) { 
     tv1.setText("your file has been downloaded"); 
     btn_ssh.setEnabled(true); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     tv1.setText("your file is getting downloaded"); 
     btn_ssh.setEnabled(false); 
    } 

See the docs here

+0

Danke für die schnelle Antwort. war es absichtlich, dass Sie die asyncTask.execute (cmd) nicht eingefügt haben; Linie? Weil ich deswegen Fehler bekomme. –

+0

@johnnycigar Es ist nur der Code für die asynchronen Parameter. Sie können das natürlich hinzufügen. –

+0

Okay, fertig, der letzte Fehler: fehlende Return-Anweisung von doinBackground (Zeile 87 <- https://pastebin.com/s21bznRT) Ich schrieb Return null, aber der Code tut nichts. Könntest du helfen? Vielen Dank! –

Verwandte Themen