いくつかの投稿を読み、ASYNCTASKに関する開発者ページを読んだ後、次のコードを思いつき、ボタンに割り当てました。
private class TalkToServerTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
String response = "";
try {
InetAddress serverAddr = InetAddress.getByName(params[0]);
Socket s = new Socket(serverAddr, Integer.valueOf(params[1]));
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(s.getOutputStream())), true);
// WHERE YOU ISSUE THE COMMANDS
out.println(params[2]);
// BufferedReader input = new BufferedReader(
// new InputStreamReader(s.getInputStream()));
DataInputStream dataInputStream = null;
dataInputStream = new DataInputStream(s.getInputStream());
st = dataInputStream.readLine().toString();
// String st = s.readLine();
// st = input.readLine();
// read line(s)
s.close();
return st;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
@Override
protected void onPostExecute(String result) {
serverresponse = result;
}
}
ボタンがクリックされると、ASyncTaskが「getDomains」という単語をサーバーで実行されているコンソールアプリに送信し、サーバーがこれに基づいて動作し、電子メールサーバーで作成されたドメインのリストを含む文字列を送り返すという考え方です。
サーバーがコマンド「getdomains」を受信していることを確認しました。サーバーは、パイプで区切られたドメインの文字列で応答します。ただし、問題は、ソケットトランザクションの結果をポップアップ表示するようにトーストを設定したのに、トーストに何も表示されないことです。もう一度ボタンを押すと、トーストにドメインのリストが表示されます。私には、ソケットが最初に空を返しているように見えます
ボタンコードは次のとおりです。
case R.id.btnDomains:
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(this);
IpAddress = sp.getString("ipaddress", "0.0.0.0");
Serverport = sp.getString("tcpport", "12345");
buttonpressed = "domains";
// TalkToServerTask task = new TalkToServerTask();
new TalkToServerTask().execute(IpAddress, Serverport, "getDomains");
Intent buttonActivity = new Intent(MainActivity.this, Rules.class);
buttonActivity.putExtra(MainActivity.DOMAINLIST, serverresponse);
Toast.makeText(getApplicationContext(), serverresponse,
Toast.LENGTH_SHORT).show();
変数「serverresponse」は、最初は空を示していますが、サーバーのリストを示しています。