2017-09-17 21 views
0

私はJavaを使い慣れていないので、パスを渡すことができるJavaファイルを作成したいと思います。このJavaクラスは結果リストを返します。主な目標は、引数をクラスに渡して結果リストを返すことができるため、3-4アクティビティでこのasynctaskを使用する必要がないことです。Javaでasynctaskクラスを作成

このスクリプトをどのように変更する必要がありますか(onCreateの削除など)

ありがとうございます!

public class Aszin extends AppCompatActivity { 

private static String USERNAME = "tom"; // username for remote host 
private static String PASSWORD = "pass"; // password of the remote host 
private static String host = "192.168.0.41"; // remote host address 
private static int port = 22; 

String cmd = "python /home/pi/Desktop/projects/ami/ami2.py "; 
TextView tv1; 
Button btn_ssh; 
private AsyncTask<String, Void, Void> asyncTask; 
ProgressBar bar; 

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

    bar = (ProgressBar) findViewById(R.id.kuki); 
    bar.setVisibility(View.INVISIBLE); 

    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, Void, Void>() { 

     @Override 
     protected Void doInBackground(String... Params) { 
      List<String> result = new ArrayList<>(); 
      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); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void param) { 
      //tv1.setText("your file has been downloaded"); 
      Toast.makeText(Aszin.this, "your file has been downloaded", Toast.LENGTH_SHORT) 
        .show(); 
      Toast.makeText(FiveButtonActivity.this, "result: " + result.toString(), Toast.LENGTH_SHORT).show(); 

      btn_ssh.setEnabled(true); 
      bar.setVisibility(View.GONE); 
     } 


     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      //tv1.setText("your file is getting downloaded"); 
      Toast.makeText(Aszin.this, "your file is getting downloaded", Toast.LENGTH_SHORT) 
        .show(); 
      bar.setVisibility(View.VISIBLE); 

      btn_ssh.setEnabled(false); 
     } 
    }; 
    asyncTask.execute(cmd); 

} 
} 

答えて

0

多くの解決策があります。 1つの方法は、関数connect2piを静的にして、ビューとしてbarbtn_sshをパラメータとして渡すことです。 Toastでは、最初のパラメータとしてbtn.ssh.getContext()を使用します。次に、どのクラスからでも静的メソッドを呼び出すことができます。

+0

クールに行くAsyncTaskの詳細と例については

ConnectPi connectPi = new ConnectPi(){ @Override protected void onPostExecute(Void param) { //tv1.setText("your file has been downloaded"); Toast.makeText(Aszin.this, "your file has been downloaded", Toast.LENGTH_SHORT) .show(); Toast.makeText(FiveButtonActivity.this, "result: " + result.toString(), Toast.LENGTH_SHORT).show(); btn_ssh.setEnabled(true); bar.setVisibility(View.GONE); } @Override protected void onPreExecute() { super.onPreExecute(); //tv1.setText("your file is getting downloaded"); Toast.makeText(Aszin.this, "your file is getting downloaded", Toast.LENGTH_SHORT) .show(); bar.setVisibility(View.VISIBLE); btn_ssh.setEnabled(false); } }; }; connectPi.execute(cmd); 

!どうもありがとう! – Marci

+0

何らかの理由で何らかの理由で私は待つ必要があります... – Marci

+0

好奇心の高まりから、ランダムなアクティビティからこのpiConnector.javaに引数を渡すにはどうしたらいいですか? https://pastebin.com/j7CrzNXW – Marci

0

拡張するAsyncTaskの別のクラスを作成できます。

public class ConnectPi extends AsyncTask<String, Void, Void> { 

    @Override 
    protected Void doInBackground(String... params) { 
     String cmd = params[0]; 
     // background code here 
    } 
}; 

そして、すべての活動に編集するさまざまな要素があるので、あなたはこのようにそれを使用することができます:https://developer.android.com/reference/android/os/AsyncTask.html

+0

ありがとう、これは非常に役に立つと思われる! – Marci

+0

ようこそ。それがポイントを与えるのを助けた場合:) –

+0

私の評判は15未満です:/ – Marci

関連する問題