Java 需要从AsyncTask返回值
我正在调用soap Web服务,需要显示返回的内容。但我做不到,因为异步任务很复杂,我不知道如何正确使用它。您能告诉我如何通过asynctask从被调用函数返回数据吗 这是我的密码Java 需要从AsyncTask返回值,java,android,web-services,android-asynctask,Java,Android,Web Services,Android Asynctask,我正在调用soap Web服务,需要显示返回的内容。但我做不到,因为异步任务很复杂,我不知道如何正确使用它。您能告诉我如何通过asynctask从被调用函数返回数据吗 这是我的密码 public class WebserviceTool { private final String NAMESPACE = "http://tempuri.org/"; private final String URL = "http://192.168.0.11:9289/Service1.asmx"; pri
public class WebserviceTool {
private final String NAMESPACE = "http://tempuri.org/";
private final String URL = "http://192.168.0.11:9289/Service1.asmx";
private final String SOAP_ACTION = "http://tempuri.org/get_currency";
private final String METHOD_NAME = "get_currency";
public static void main(String[] args) {
// TODO Auto-generated method stub
}
public String execute_barcode_webservice(String s1, String s2) {
//Create request
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("date",s1);
request.addProperty("cur_code",s2);
//Create envelope
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.encodingStyle = SoapEnvelope.ENC;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
Object response;
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
response = (Object) envelope.getResponse();
Log.i("my_error", response.toString());
} catch (Exception e) {
Log.i("my_error", e.getMessage().toString());
}
return "testarif";
}
public class AsyncCallWS extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
try {
execute_barcode_webservice(params[0], params[1]);
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
@Override
protected void onPostExecute(Void result) {
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
}
公共类WebService工具{
私有最终字符串命名空间=”http://tempuri.org/";
私有最终字符串URL=”http://192.168.0.11:9289/Service1.asmx";
私有最终字符串SOAP_ACTION=”http://tempuri.org/get_currency";
私有最终字符串方法\u NAME=“获取\u货币”;
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
}
公共字符串执行\条形码\ Web服务(字符串s1、字符串s2){
//创建请求
SoapObject请求=新的SoapObject(名称空间、方法名称);
请求。添加属性(“日期”,s1);
请求。添加属性(“当前代码”,s2);
//创建信封
SoapSerializationEnvelope=新的SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.encodingStyle=SoapEnvelope.ENC;
envelope.setOutputSoapObject(请求);
HttpTransportSE androidHttpTransport=新的HttpTransportSE(URL);
目标反应;
试一试{
调用(SOAP_操作,信封);
response=(对象)envelope.getResponse();
Log.i(“我的错误”,response.toString());
}捕获(例外e){
Log.i(“我的错误”,例如getMessage().toString());
}
返回“testarif”;
}
公共类AsyncCallWS扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(字符串…参数){
试一试{
执行条形码Web服务(参数[0],参数[1]);
}捕获(例外e){
//TODO:处理异常
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的void onProgressUpdate(void…值){
}
}
}
这是执行所有作业并返回数据的函数execute_barcode_webservice()。但是由于我调用了execute\u barcode\u webservice()view AsyncTask,我不知道如何返回它。如何执行?异步任务执行的结果是
执行\u barcode\u webservice()
生成的响应
对象。但是,不要认为异步任务会执行并向您返回值。相反,在方法onPostExecute()
中,您必须获取响应
对象并对其进行处理(提取其值并将其显示在列表中,或者执行您想对其执行的任何操作)。异步任务只是在一个单独的线程中执行一些代码,然后返回主线程(UI线程)并处理结果的一种方式,这在onPostExecute()
中完成
我的建议是:重写execute\u barcode\u webservice()以返回响应
对象,而不是字符串
(如果操作失败,该对象可以是null
),并将该对象传递给onPostExecute()
方法。您必须将异步任务更改为:
public class AsyncCallWS extends AsyncTask<String, Void, Object> {
@Override
protected Object doInBackground(String... params) {
Object response = null;
try {
response = execute_barcode_webservice(params[0], params[1]);
} catch (Exception e) {
// TODO: handle exception
}
return response;
}
@Override
protected void onPostExecute(Object response) {
if (response != null) {
// display results in a list or something else
}
}
公共类AsyncCallWS扩展了AsyncTask{
@凌驾
受保护对象doInBackground(字符串…参数){
对象响应=null;
试一试{
响应=执行条形码Web服务(参数[0],参数[1]);
}捕获(例外e){
//TODO:处理异常
}
返回响应;
}
@凌驾
受保护的void onPostExecute(对象响应){
if(响应!=null){
//以列表或其他形式显示结果
}
}
异步任务执行的结果是由execute\u barcode\u webservice()
生成的response
对象。但是,不要认为异步任务会执行并向您返回值。相反,在方法内部onPostExecute()
您必须获取响应
对象并对其进行处理(提取其值并将其显示在列表中,或者您想对其执行的任何操作)。异步任务只是在单独的线程中执行某些代码,然后返回主线程(UI线程)并处理结果的一种方式,这在onPostExecute()
中完成
我的建议是:重写execute\u barcode\u webservice()以返回响应
对象,而不是字符串
(如果操作失败,该对象可以为null
),并将该对象传递给onPostExecute()
方法。您必须将异步任务更改为:
public class AsyncCallWS extends AsyncTask<String, Void, Object> {
@Override
protected Object doInBackground(String... params) {
Object response = null;
try {
response = execute_barcode_webservice(params[0], params[1]);
} catch (Exception e) {
// TODO: handle exception
}
return response;
}
@Override
protected void onPostExecute(Object response) {
if (response != null) {
// display results in a list or something else
}
}
公共类AsyncCallWS扩展了AsyncTask{
@凌驾
受保护对象doInBackground(字符串…参数){
对象响应=null;
试一试{
响应=执行条形码Web服务(参数[0],参数[1]);
}捕获(例外e){
//TODO:处理异常
}
返回响应;
}
@凌驾
受保护的void onPostExecute(对象响应){
if(响应!=null){
//以列表或其他形式显示结果
}
}
可能的dup:可能的dup:在doinbackground函数中,您正在返回和对象,但返回类型为void@ayilmaz:谢谢,我已经修复了代码。看,您已经掌握了这个概念!如何在onPostExecute()中显示返回的数据?我想在调用asynctask的位置返回数据。因此,在这种情况下为什么需要使用asynctask?“我想在调用asynctask的地方返回数据”-这不是一个好主意,因为您必须等待异步任务执行后才能获得数据(例如使用while()
),这违反了并行执行点。无论您打算如何处理结果数据,请在onPostExecute()中执行
或仍在doInBackground()
中。如果要显示数据,必须在onPostExecute()中完成