返回类型与Asynctask不兼容 [英] the return type is incompatible with Asynctask

查看:97
本文介绍了返回类型与Asynctask不兼容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使用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不兼容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆