Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未使用异步任务调用Web服务_Java_Android_Android Asynctask - Fatal编程技术网

Java 未使用异步任务调用Web服务

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

我需要连接到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 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?