AsyncTask - 扩展和doInBackground需要哪些参数?

时间:2012-10-17 19:59:49

标签: android android-asynctask

使用AsyncTask的代码有什么问题?特别是: - 我需要在fetchSchools中放入哪些参数 - 我需要在doInBackground中放入哪些参数?

我发现了许多“有用的”示例,但它们都在这些参数中使用了伪代码,并没有解释我实际需要放在那里的内容。

“我得到Eclipse错误的方法fetchSchools必须实现继承的抽象方法AsynchTask ......”

我不需要传递任何东西,我希望它能返回一个字符串。

public class fetchSchools extends AsyncTask<Void, Void, String> {

public String doInBackground(String retval) {
       StringBuilder builder = new StringBuilder();
        HttpClient client = new DefaultHttpClient();

        HttpGet httpGet = new HttpGet("http://www.domain/schools.php");
        try 
     {
          HttpResponse response = client.execute(httpGet);
          StatusLine statusLine = response.getStatusLine();
          int statusCode = statusLine.getStatusCode();
          if (statusCode == 200) {
            HttpEntity entity = response.getEntity();
            InputStream content = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(content));
            String
     line;

            int a=0;
            while ((line = reader.readLine()) != null) {
              builder.append(line);
            Log.i(MainActivity.class.getName(), "Reading in: " + a +" : "+ line);
            a++;
            }
          } else {
            Log.e(MainActivity.class.toString(), "Failed to download file");
          }
        } catch (ClientProtocolException e) {
          e.printStackTrace();
        } catch (IOException e)
     {
          e.printStackTrace();
        }

        return builder.toString(); 
}

protected void onPostExecute() {
}

}

2 个答案:

答案 0 :(得分:11)

你给了doInBackground一个字符串参数,所以async task first参数必须是string not void。

AsyncTask<String , Void, String> {

如果您不想传递参数,请不要为doInBackground函数提供参数。

检查此页面以获取asynctask参考: http://developer.android.com/reference/android/os/AsyncTask.html

asynctask的第一个参数转到doInBackground函数,第二个转到onprogressUpdate函数,第三个参数转到onpostexecute函数。

我想你想这样做:

 public class fetchSchools extends AsyncTask<Void, Void, String> {
    @Override
    protected String doInBackground(Void... arg0) {
      StringBuilder builder = new StringBuilder();
      HttpClient client = new DefaultHttpClient();
      // ...

     return builder.toString();
    }
    protected void onPostExecute(String retval) 
    {

    }
  }

答案 1 :(得分:1)

  

我不需要传递任何东西,我希望它能返回一个字符串。

然后

public class fetchSchools extends AsyncTask<Void, Void, String> {
  @Override
  protected String doInBackground(Void... params) {
    // ...
  }
}