问题描述
我试图使用AsyncTask捕获httpclient的响应,但抛出以下错误,以验证字符串中的doInBackground是否不兼容:
返回类型与AsyncTask不兼容"
我尝试捕获httpclient的响应字符串,并将其返回到doInBackground中,以便在onPostExecute中使用它.
有人可以帮助我.
谢谢
private String insertar(){
String response = "";
HttpClient httpclient;
List<NameValuePair> nameValuePairs;
HttpPost httppost;
httpclient=new DefaultHttpClient();
httppost= new HttpPost("http://10.1.1.20/pruebaAndroid/insert.php"); // Url del Servidor
//Añadimos nuestros datos
nameValuePairs = new ArrayList<NameValuePair>(4);
nameValuePairs.add(new BasicNameValuePair("dni",dni.getText().toString().trim()));
nameValuePairs.add(new BasicNameValuePair("nombre",nombre.getText().toString().trim()));
nameValuePairs.add(new BasicNameValuePair("telefono",telefono.getText().toString().trim()));
nameValuePairs.add(new BasicNameValuePair("email",email.getText().toString().trim()));
try {
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));// envio las variables
// capturo lo que devuelve, si no devolviera nada solo hago la ejecucion del httpclient sin el handler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
response = httpclient.execute(httppost, responseHandler);
//----------------------------------------------------------------
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return response;
}
这是AsyncTask:
//AsyncTask para insertar Personas
class Insertar extends AsyncTask<String,String,Boolean>{
private Activity context;
Insertar(Activity context){
this.context=context;
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
String result = insertar();
return result;
}
@Override
protected void onPostExecute(Boolean result) {
}
}
这里的问题是AsyncTask扩展是通用的,需要三种类型:AsyncTask<Params, Progress, Result>
AsyncTask可以是Void或类,但不是原始数据类型./p>
那么您会告诉编译器doInBackground返回一个原始var,但它期望的是类String
的实例.
因此,将doInBackground
函数用作
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
String result = insertar();
return result;
}
修改
在AsyncTask中,您将返回Boolean
,而在doInBackground中,返回类型为String
,所以
将其更改为String
是因为您想要来自insertar()
函数的字符串值,即改变
class Insertar extends AsyncTask<String,String,Boolean>{
到
class Insertar extends AsyncTask<String,String,String>{
和
@Override
protected void onPostExecute(Boolean result) {
}
到
@Override
protected void onPostExecute(String result) {
}
I'm trying to capture the response of httpclient using AsyncTask but throws me the following error verifying any incompatibility doInBackground in the String:
"the return type is incompatible with AsyncTask"
I try to capture the string of response of httpclient and return it in doInBackground for to use this in onPostExecute.
Someone could help me.
Thank you
private String insertar(){
String response = "";
HttpClient httpclient;
List<NameValuePair> nameValuePairs;
HttpPost httppost;
httpclient=new DefaultHttpClient();
httppost= new HttpPost("http://10.1.1.20/pruebaAndroid/insert.php"); // Url del Servidor
//Añadimos nuestros datos
nameValuePairs = new ArrayList<NameValuePair>(4);
nameValuePairs.add(new BasicNameValuePair("dni",dni.getText().toString().trim()));
nameValuePairs.add(new BasicNameValuePair("nombre",nombre.getText().toString().trim()));
nameValuePairs.add(new BasicNameValuePair("telefono",telefono.getText().toString().trim()));
nameValuePairs.add(new BasicNameValuePair("email",email.getText().toString().trim()));
try {
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));// envio las variables
// capturo lo que devuelve, si no devolviera nada solo hago la ejecucion del httpclient sin el handler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
response = httpclient.execute(httppost, responseHandler);
//----------------------------------------------------------------
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return response;
}
This is AsyncTask:
//AsyncTask para insertar Personas
class Insertar extends AsyncTask<String,String,Boolean>{
private Activity context;
Insertar(Activity context){
this.context=context;
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
String result = insertar();
return result;
}
@Override
protected void onPostExecute(Boolean result) {
}
}
the problem here is that AsyncTask Extensions are generic and need three types: AsyncTask<Params, Progress, Result>
AsyncTask which may be Void or a class, but not primitive data types.
so what happens is you told the compiler that doInBackground returns a primitive var but it was expecting an instance of the class String
.
So use doInBackground
function as
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
String result = insertar();
return result;
}
Edit
In AsyncTask you are returning Boolean
and in doInBackground return type is String
,so
change it to String
because you want String value from insertar()
function,i.e. change
class Insertar extends AsyncTask<String,String,Boolean>{
to
class Insertar extends AsyncTask<String,String,String>{
and
@Override
protected void onPostExecute(Boolean result) {
}
to
@Override
protected void onPostExecute(String result) {
}
这篇关于返回类型与Asynctask不兼容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!