AsyncTask ...类必须声明为抽象,或者在'AsyncTask'中实现抽象方法'doInBackground(Params ...)'仍会出错

时间:2018-07-18 23:18:25

标签: java android android-asynctask abstract-class

如何将doInBackground()方法实现为抽象方法? IDE还说,对于AsyncTask <...>

,我需要3个参数,而不是1个
package com.example.a_phi.nowswap;

import android.os.AsyncTask;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

public class EstablishConnection extends AsyncTask<String>{

    StringBuilder sb = new StringBuilder();

    public String doInBackground(String id) {

        String link = "http://213.251.43.215/addContact.php";

        try {
            URL url = new URL(link);
            String data = URLEncoder.encode("id", "UTF-8")
                    + "=" + URLEncoder.encode(id, "UTF-8");

            URLConnection conn = url.openConnection();
            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(data);
            wr.flush();
            BufferedReader reader = new BufferedReader(new
                    InputStreamReader(conn.getInputStream()));

            String line;

            // Read Server Response
            while((line = reader.readLine()) != null) {
                sb.append(line);
                break;
            }

        }catch(MalformedURLException e) {
            System.out.print("MalformedURLException" + e.getMessage());
            e.printStackTrace();
        }
        catch(IOException e){
            System.out.print("IOException"+e.getMessage());
            e.printStackTrace();
        }

        return sb.toString();
}
}

如何将doInBackground()方法实现为抽象方法? IDE还说,对于AsyncTask <...>

,我需要3个参数,而不是1个

3 个答案:

答案 0 :(得分:2)

The documentation表示AsyncTask具有3个通用参数:<Params, Progress, Result>

  

AsyncTask的通用类型

     

异步任务使用的三种类型如下:

     
      
  1. 参数,执行时发送给任务的参数类型。
  2.   
  3. 进度,是后台计算过程中发布的进度单位的类型。
  4.   
  5. 结果,背景计算结果的类型。并非所有类型都总是由异步任务使用。要将类型标记为未使用,只需使用类型Void
  6.   
     

private class MyTask extends AsyncTask<Void, Void, Void> { ... }

您似乎希望ParamsResult的类型为String(根据您对doInBackground方法的签名),因此您的类应该{{1 }},并实施extends AsyncTask<String,Void,String>

答案 1 :(得分:1)

我将doInBackground(String id)更改为doInBackground(String... id)。 我也将AsyncTask<String>更改为AsyncTask<String, String, String>,然后它起作用了。

答案 2 :(得分:0)

doInBackground()方法的签名与您尝试实现的签名不同,为shown in the documentation

请注意,AsyncTask抽象类要求您的方法实现具有以下签名:

doInBackground(Params...) // the "..." is to say, an arbitrary number of arguments

等效于此,而不是您当前正在做什么:

doInBackground(Param) // a method with a single argument only

如果您按照以下方式更新实现,它将解决您的编译问题:

// Update the method signature of doInBackground as follows:
public String doInBackground(String... ids) {

    String id = ids[0];

    /* Beyond this point, you can leave your current implementation as it is*/
}