-2
Webサービスに接続し、Androidを使用してXML出力を取得する必要があります。 Webサービスは、指定された単語に対して同義語を英語で提供します。あなたは次のように私は、コードを変更した非同期タスクを使用せずに、Androidの中でこれを行うことはできませんので、次のJavaコードは、しかし、APIプロバイダによって非同期タスクを使用してWebサービスが呼び出されない
public class Thesaurus {
public static void main(String[] args) {
new SendRequest("peace", "en_US", "test", "xml");
}
} // end of Thesaurus
class SendRequest {
final String endpoint = "http://thesaurus.altervista.org/thesaurus/v1";
public SendRequest(String word, String language, String key, String output) {
try {
URL serverAddress = new URL(endpoint + "?word=" + URLEncoder.encode(word, "UTF-8") + "&language=" + language + "&key=" + key + "&output=" + output);
HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
connection.connect();
int rc = connection.getResponseCode();
if (rc == 200) {
String line = null;
BufferedReader br = new BufferedReader(new java.io.InputStreamReader(connection.getInputStream()));
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line + '\n');
}
System.out.print(sb.toString());
} else {
System.out.println("HTTP error:" + rc);
}
connection.disconnect();
} catch (java.net.MalformedURLException e) {
e.printStackTrace();
} catch (java.net.ProtocolException e) {
e.printStackTrace();
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
} // end of SendRequest
を提供され、
class SendRequest extends AsyncTask<Void, Void, Void> {
final String endpoint = "http://thesaurus.altervista.org/thesaurus/v1";
final String key = "test";
final String language = "en_US";
final String output = "xml";
@Override
protected Void doInBackground(Void... params) {
try {
URL serverAddress = new URL(endpoint + "?word=" + URLEncoder.encode(text, "UTF-8") + "&language=" + language + "&key=" + key + "&output=" + output);
HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
connection.connect();
int rc = connection.getResponseCode();
if (rc == 200) {
String line = null;
BufferedReader br = new BufferedReader(new java.io.InputStreamReader(connection.getInputStream()));
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line + '\n');
}
synonymTxt = sb.toString();
} else {
synonymTxt = "HTTP error:" + rc;
}
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
AlertDialog ad1 = new AlertDialog.Builder(CreateAppointmentActivity.this).create();
ad1.setTitle("Synonym Results");
ad1.setMessage(synonymTxt);
ad1.setButton(AlertDialog.BUTTON_POSITIVE, "Okay", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
ad1.show();
}
}
ここに私の問題があります実行後ブロックは実行されますが、出力は空として与えられます。 Asyncタスクは内部クラスとして使用され、変数 "text"と "synonymtxt"はクラスレベルの変数です。私はこれで約12時間苦労しています。私の唯一の提案は、非同期タスクが完了するまでコードが待たないということです。どうすればこの出力を得ることができますか?
'synonymTxt =' sb.toString();の行の後に 'synonymTxt'の値を記録するとどうなりますか? –
onPostExecuteのAlertDialogは、それが空であることを示します。 –
コンソールログに印刷して、Webサービスから返される内容を確認してください。 –