Android 如何将参数传递给AsyncTask(Ksoap2)
嗨,我想把一个变量传递给AsyncTask 我有这个变量Android 如何将参数传递给AsyncTask(Ksoap2),android,android-asynctask,android-ksoap2,Android,Android Asynctask,Android Ksoap2,嗨,我想把一个变量传递给AsyncTask 我有这个变量 private static String NAMESPACE = "aaa"; private static String METHOD_NAME = "bbb"; private static String SOAP_ACTION = NAMESPACE + METHOD_NAME ; private static String URL = "ccc"; 我有这个任务 public class Login extends
private static String NAMESPACE = "aaa";
private static String METHOD_NAME = "bbb";
private static String SOAP_ACTION = NAMESPACE + METHOD_NAME ;
private static String URL = "ccc";
我有这个任务
public class Login extends AsyncTask<Void, Void, String>
{
ProgressDialog progress;
String response = "";
private ProgressDialog pDialog;
public void onPreExecute()
{
super.onPreExecute();
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Please Wait");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected String doInBackground(Void... arg0) {
final SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("username", user_name);
request.addProperty("userpass", user_pass);
final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
envelope.dotNet = true;
try
{
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive result = (SoapPrimitive) envelope.getResponse();
response = result.toString();
}
catch (IOException e)
{
response = "Error In The Operation(1) !!\n Check Internet Connection And TRY AGAIN.";
}
catch (Exception e)
{
response = "Error In The Operation(2) !!\n Check Internet Connection And TRY AGAIN.";
}
return response;
}
@Override
public void onPostExecute(String res)
{
if(!(res.equalsIgnoreCase("")))
{
if (res.toString().contains(",") == true)
{
String[] separated = res.split(",");
tv.setText(separated[1]);
return;
}
if(res.toString().equals("1"))
{
res = "Wrong User name OR password ,, TRY AGAIN ..";
tv.setText(res);
pDialog.dismiss();
return;
}
if(res.toString().equals("2"))
{
res = "Your Account Is temporarily Blocked ,, Please Call The Admin";
tv.setText(res);
pDialog.dismiss();
return;
}
if(res.toString().equals("3"))
{
res = "Error While Retrieve S Information ,, Try Again Later .";
tv.setText(res);
pDialog.dismiss();
return;
}
tv.setText(res);
pDialog.dismiss();
}
}
}
成功
new Login().execute(URL,NAMESPACE,METHOD,USERNAME,USERPASS);
使用Knolledge,此任务返回字符串:)
并且doInBackground必须为user\u name和user\u pass指定一个值,user\u pass需要通过执行调用传递该值
关于…让类登录扩展
AsyncTask
并将doInBackground(Void…params)
更改为doInBackground(String…params)
。
现在,您可以用想要的方式执行任务,newlogin().execute(URL、名称空间、方法、用户名、USERPASS)代码>,并通过params[]数组访问给定参数。
对于您的示例,这意味着:params[0]==URL、params[1]==NAMESPACE等等。首先需要更改
公共类登录扩展异步任务
到
公共类登录扩展异步任务
改变
doInBackground(无效…
到
doInBackground(字符串…
。如果您仍然有问题,请更具体地说明哪些问题正在解决,哪些问题没有解决
异步任务使用的三种类型如下:
Params,执行时发送到任务的参数类型
Progress,在过程中发布的进度单位的类型
背景计算
Result,结果的类型
背景计算
这些是
中的参数。第一个字符串
是传递的内容,这就是doInBackground()中的原因
您有String…
指示正在传递的字符串和字符串数组为什么不为Login类创建一个构造函数,如下所示?在我的例子中,我将向AsyncTask传递一个活动,以便在完成后调用回调函数,但在您的例子中,您也可以传递字符串数组
在下面的这种情况下,args数组被传递给类构造函数,而params数组被传递给doInBackground函数。MainActivity被传递给AsyncTask,以便任务完成后可以在MainActivity中调用taskDone回调
public class Login extends AsyncTask<String, Void, String>
{
private MainActivity activity;
//These private strings are only needed if you require them
//outside of the doInBackground function....
//If not, just use the params argument of doInBackground by itself
private String METHODNAME,
private String NAMESPACE;
private String SOAPACTION;
private String USER_NAME;
private String USER_PASS;
public Login(String[] args, MainActivity activity) {
this.NAMESPACE= args[0];
this.METHODNAME = args[1];
this.SOAPACTION = args[2];
this.USER_NAME = args[3];
this.USER_PASS= args[4];
this.activity = activity;
}
@Override
protected Void doInBackground(String... params) {
//Again, use either params local to this function
//or args local to the entire function...
//both would be redundant
String _NAMESPACE = params[0];
String _METHODNAME = params[1];
String _SOAPACTION = params[2];
String _USER_NAME = params[3];
String _USER_PASS= params[4];
//Do background stuff
}
protected void onPostExecute() {
//dismiss progress dialog if needed
//Callback function in MainActivity to indicate task is done
activity.taskDone("some string");
}
}
您可以在execute中传递任意数量的参数,因为doInbackground(params…params)(可以将其视为params[]params)接受任意数量的参数,只要它们是相同类型的参数
但是如果您的参数是不同类型的(这不是您的情况),您需要将它们作为asynctask类的属性,并通过asynctask构造函数将它们的值作为新登录名(type1 attr1,type2 attr2)传递给您。执行(params)
:看来您已经找到了解决问题的方法…我认为问题出在这里,公共类登录扩展了异步任务我应该传递5个值(METHODNAME、NAMESPACE、SOAPACTION、USER\u NAME、USER\u Pass)对于此任务…它只有3个可用值可传递,这3个值是传递的参数、进度类型和结果。请参阅我编辑的答案和所附的链接,当您说任务必须返回字符串时,可能会更清楚,您的意思是在任务完成时,它会将字符串作为一个字符串异步返回给调用函数吗回调?并且,正如其他人所建议的,您需要将类定义更改为public class Login-extends-AsyncTask
public class Login extends AsyncTask<String, Void, String>
{
private MainActivity activity;
//These private strings are only needed if you require them
//outside of the doInBackground function....
//If not, just use the params argument of doInBackground by itself
private String METHODNAME,
private String NAMESPACE;
private String SOAPACTION;
private String USER_NAME;
private String USER_PASS;
public Login(String[] args, MainActivity activity) {
this.NAMESPACE= args[0];
this.METHODNAME = args[1];
this.SOAPACTION = args[2];
this.USER_NAME = args[3];
this.USER_PASS= args[4];
this.activity = activity;
}
@Override
protected Void doInBackground(String... params) {
//Again, use either params local to this function
//or args local to the entire function...
//both would be redundant
String _NAMESPACE = params[0];
String _METHODNAME = params[1];
String _SOAPACTION = params[2];
String _USER_NAME = params[3];
String _USER_PASS= params[4];
//Do background stuff
}
protected void onPostExecute() {
//dismiss progress dialog if needed
//Callback function in MainActivity to indicate task is done
activity.taskDone("some string");
}
}
private String[] args= {"mynamespace", "mymethods", "mysoap", "myuser", "mypass"}; //to pass to constructor
private String[] params= {"mynamespace", "mymethods", "mysoap", "myuser", "mypass"}; //to pass to doInBackground
//Pass your args array and the current activity to the AsyncTask
new Login(args, MainActivity.this).execute(params);
//Callback for AsyncTask to call when its completed
public void taskDone(String returnVal) {
//Do stuff once data has been loaded
returnText = returnVal;
}