Java 未使用异步任务调用Web服务
我需要连接到web服务并使用Android获得XML输出。web服务为给定单词提供英语同义词。以下Java代码由API提供程序提供Java 未使用异步任务调用Web服务,java,android,android-asynctask,Java,Android,Android Asynctask,我需要连接到web服务并使用Android获得XML输出。web服务为给定单词提供英语同义词。以下Java代码由API提供程序提供 public class Thesaurus { public static void main(String[] args) { new SendRequest("peace", "en_US", "test", "xml"); } } // end of Thesaurus class SendRequest { final String e
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
但是,由于在Android中,如果不使用异步任务,则无法执行此操作,因此我对代码进行了如下修改:
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();
}
}
类SendRequest扩展了异步任务{
最终字符串端点=”http://thesaurus.altervista.org/thesaurus/v1";
最终字符串key=“test”;
最终字符串语言=“en_US”;
最终字符串输出=“xml”;
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
URL serverAddress=新URL(端点+”?word=“+URLEncoder.encode(文本,“UTF-8”)+”&language=“+language+”&key=“+key+”&output=“+output”);
HttpURLConnection connection=(HttpURLConnection)serverAddress.openConnection();
connection.connect();
int rc=connection.getResponseCode();
如果(rc==200){
字符串行=null;
BufferedReader br=新的BufferedReader(新的java.io.InputStreamReader(connection.getInputStream());
StringBuilder sb=新的StringBuilder();
而((line=br.readLine())!=null){
sb.追加(第+'\n'行);
}
同义词txt=sb.toString();
}否则{
同义词txt=“HTTP错误:”+rc;
}
连接断开();
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
AlertDialog ad1=新建AlertDialog.Builder(CreateAppointmentActivity.this).create();
ad1.设置标题(“同义词结果”);
ad1.setMessage(同义词txt);
ad1.setButton(AlertDialog.BUTTON_“确定”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
}
});
ad1.show();
}
}
我这里的问题是执行后块,但输出为空。异步任务用作内部类,变量“text”和“synonymtxt”是类级变量。我已经为此奋斗了将近12个小时,我唯一的建议是代码不要等到异步任务完成。我怎样才能得到这个的输出?我发现了问题。这是我自己的错。我把权限放错了舱单的位置。重新定位了它们,现在它工作了如果在
synonymTxt=sb.toString()行之后记录synonymTxt
的值,您会得到什么代码>?onPostExecute中的AlertDialog显示为空。请尝试在控制台日志中打印它,以查看web服务返回的内容。为什么不使用rxJava?