如何在Android中正确使用AsyncTask

45

我不想向AsyncTask的doInBackground方法传递任何参数。

那么代码应该是什么样的呢?


在发布之前先尝试一下...阅读博客和开发者指南。 - NullPointerException
1
你必须阅读... 点击这里 - Thomas Daniel
4个回答

99
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;

public class AsyncExample extends Activity{


private String url="http://www.google.co.in";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}


@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

    new AsyncCaller().execute();

}

private class AsyncCaller extends AsyncTask<Void, Void, Void>
{
    ProgressDialog pdLoading = new ProgressDialog(AsyncExample.this);

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        //this method will be running on UI thread
        pdLoading.setMessage("\tLoading...");
        pdLoading.show();
    }
    @Override
    protected Void doInBackground(Void... params) {

        //this method will be running on background thread so don't update UI frome here
        //do your long running http tasks here,you dont want to pass argument and u can access the parent class' variable url over here


        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        //this method will be running on UI thread

        pdLoading.dismiss();
    }

    }
}

谢谢!看起来就像我想要的... :D - omerjerk

18
根据 AsyncTask,其。
 AsyncTask<Params, Progress, Result>
  • Params是在执行任务时发送给任务的参数的类型。
  • Progress是在后台计算期间发布的进度单位的类型。
  • Result是后台计算结果的类型。

因此,如果您想在doInBackground中传递void,请将void替换为Params。

示例代码:

class DownloadLink extends AsyncTask<Void, Void, Void> {


        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub

            //Do Your stuff here..
            return null;
        }
    }

并将其称为:

 new DownloadLink().execute();

这意味着params是任务数组,而所有任务的返回类型都是void。 - blackHawk
@blackHawk - 是的 - Name is Nilay

9

如果您不希望向doInBackground传递任何参数,请按照以下步骤创建您的AsyncTask类:

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


          public LongOperation(Context context) {

          }

          @Override
          protected void onPreExecute() {

          }

          @Override
          protected String doInBackground(Void... params) {

              return null;
          }      

          @Override
          protected void onPostExecute(String result) {                           

          }
    }

不传递任何参数即可启动AsyncTask:

   LongOperation longOperation = new LongOperation(this);
   longOperation.execute();

我注意到Android Studio自动完成功能不会给出"<Void,Void,String>",这可能会让你困惑。此外,请注意doInBackground的返回值确实必须是类的第三个参数(在示例中为"String")。 - Fattie

8

为什么你不想传递任何参数?你应该解释一下...

通常情况下是这样的(示例):

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

要执行它,您需要调用:

new DownloadFilesTask().execute(url1, url2, url3);

Source: Android docs


通常情况下,参数被传递给 AsyncTask 但并不是必需的。 - codeMagic
我不需要向 doInBackground 传递任何参数。这个方法只是通过POST方法打开我的Web服务器上的一个PHP文件。我只需要从那个PHP文件中获取响应。因此,我不需要向 doInBackground 传递任何参数。 - omerjerk
简单 - 你只需要使用 Void 类。所以你会有 private class DownloadFilesTask extends AsyncTask<Void, Integer, Long> { - Oleg Vaskevich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接