返回类型与 Asynctask 不兼容

Posted

技术标签:

【中文标题】返回类型与 Asynctask 不兼容【英文标题】:the return type is incompatible with Asynctask 【发布时间】:2014-08-29 12:55:58 【问题描述】:

我正在尝试使用 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 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 的声明。 var 像 String 一样声明 好的,但是,post the declaration of the AsyncTask. (有趣的是,每当一个人说多于 1 件事时,除了最后一个之外的所有事情都会立即被驳回)(显然每个人都会这样做) 用我的 AsyncTask 完成检查我的编辑代码 您定义异步任务的方式,doInBackground 必须返回一个布尔值。 【参考方案1】:

这里的问题是 AsyncTask 扩展是通用的,需要三种类型:AsyncTask&lt;Params, Progress, Result&gt;AsyncTask 可能是 Void 或类,但不是原始数据类型。

所以发生的情况是你告诉编译器 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) 

        

【讨论】:

@user3810167 var 是“string”而不是“String”,请发布完整的异步任务代码。 @user3810167 乐于助人,享受编码。

以上是关于返回类型与 Asynctask 不兼容的主要内容,如果未能解决你的问题,请参考以下文章

从片段调用 Android AsyncTask 没有调用其成员 - doInbackground、onpreexecute、onpostexecute

AsyncTask源码解析

AsyncTask中onPostExecute方法的返回类型可以不为void吗?

Typescript 泛型与返回类型不兼容

Android开发学习之路-使用AsyncTask进行异步操作

如何从android中的自定义适配器调用Activity asynctask