什么参数传递给AsyncTask <arg1,arg2,=“”arg3 =“”>?</arg1,>

时间:2011-05-19 04:00:34

标签: android arguments android-asynctask

我不明白我应该放在这里以及这些论点最终的位置?究竟应该放什么,它究竟会去哪里?我是否需要包括所有3或者我可以包括1,2,20?

5 个答案:

答案 0 :(得分:469)

谷歌的Android文档说:

异步任务由3种泛型类型定义,称为Params,Progress和Result,以及4个步骤,分别称为onPreExecute,doInBackground,onProgressUpdate和onPostExecute。

AsyncTask的泛型类型:

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

Params, the type of the parameters sent to the task upon execution.
Progress, the type of the progress units published during the background computation.
Result, the type of the result of the background computation.

并非所有类型都始终由异步任务使用。要将类型标记为未使用,只需使用类型Void:

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

您可以进一步参考:http://developer.android.com/reference/android/os/AsyncTask.html

或者你可以通过引用Sankar-Ganesh's Blog

来清楚AsyncTask的作用

Well典型的AsyncTask类的结构如下:

private class MyTask extends AsyncTask<X, Y, Z>

    protected void onPreExecute(){

    }

在启动新线程之前执行此方法。没有输入/输出值,因此只需初始化变量或您认为需要做的任何事情。

    protected Z doInBackground(X...x){

    }

AsyncTask类中最重要的方法。你必须在这里放置你想要在后台做的所有东西,与主要的不同。这里我们有一个输入值来自“X”类型的对象数组(你在标题中看到了吗?我们有“...... extends AsyncTask”这些是输入参数的类型)并从类型中返回一个对象“Z”。

   protected void onProgressUpdate(Y y){

   }

使用方法publishProgress(y)调用此方法,并且通常在要在主屏幕中显示任何进度或信息时使用它,例如显示您在后台执行操作的进度条的进度条。

  protected void onPostExecute(Z z){

  }

在后台操作完成后调用此方法。作为输入参数,您将收到doInBackground方法的输出参数。

X,Y和Z类型怎么样?

您可以从上述结构中推断:

 X – The type of the input variables value you want to set to the background process. This can be an array of objects.

 Y – The type of the objects you are going to enter in the onProgressUpdate method.

 Z – The type of the result from the operations you have done in the background process.

我们如何从外部课程中调用此任务?只需以下两行:

MyTask myTask = new MyTask();

myTask.execute(x);

其中x是X类型的输入参数。

一旦我们的任务运行,我们就可以从“外部”找到它的状态。使用“getStatus()”方法。

 myTask.getStatus();

我们可以收到以下状态:

RUNNING - 表示任务正在运行。

PENDING - 表示该任务尚未执行。

已完成 - 表示onPostExecute(Z)已完成。

有关使用AsyncTask的提示

  1. 不要手动调用onPreExecute,doInBackground和onPostExecute方法。这是由系统自动完成的。

  2. 您无法在另一个AsyncTask或Thread中调用AsyncTask。方法execute的调用必须在UI Thread。

  3. 中完成
  4. onPostExecute方法在UI线程中执行(这里你可以调用另一个AsyncTask!)。

  5. 任务的输入参数可以是一个Object数组,这样就可以放置你想要的任何对象和类型。

答案 1 :(得分:59)

我来晚了,但认为这可能对某人有所帮助。

答案 2 :(得分:5)

保持简单!

AsyncTask是在后台线程中运行的后台任务。它需要一个输入,执行进度并给出输出

  

AsyncTask<Input,Progress,Output>

我认为混淆的主要根源是当我们尝试记住AsyncTask中使用的参数时。关键是不要记住。如果您可以直观地看到任务真正需要做什么,那么以正确的签名编写AsyncTask就是小菜一碟。
只需弄清楚您的输入,进度和输出是什么,您就可以开始工作了。

例如: enter image description here

AsyncTask的心脏!

doInBackgound()方法是AsyncTask中最重要的方法,因为

  • 仅此方法在后台线程中运行,并将数据发布到UI线程。
  • 其签名随AsyncTask参数而变化。

让我们看看这种关系

enter image description here

  

doInBackground()onPostExecute()onProgressUpdate()也相关

enter image description here

向我显示代码
那么我该如何为DownloadTask编写代码?

DownloadTask extends AsyncTask<String,Integer,String>{

      @Override
      public void onPreExecute()
      {}

      @Override
      public String doInbackGround(String... params)
      {
               // Download code
               int downloadPerc = // calculate that
               publish(downloadPerc);

               return "Download Success";
      }

      @Override
      public void onPostExecute(String result)
      {
          super.onPostExecute(result);
      }

      @Override
      public void onProgressUpdate(Integer... params)
      {
             // show in spinner, access UI elements
      }

}

您将如何运行此任务

new DownLoadTask().execute("Paradise.mp3");

答案 3 :(得分:4)

请参阅以下链接:

  1. http://developer.android.com/reference/android/os/AsyncTask.html
  2. http://labs.makemachine.net/2010/05/android-asynctask-example/
  3. 如果你只想传递一个参数,那么你不能传递三个以上的参数,然后对另外两个参数使用void。

    1. private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> 
    
    
    2. protected class InitTask extends AsyncTask<Context, Integer, Integer>
    

    异步任务由在后台线程上运行的计算定义,其结果在UI线程上发布。异步任务由3种泛型类型定义,称为Params,Progress和Result,以及4个步骤,称为onPreExecute,doInBackground,onProgressUpdate和onPostExecute。

    KPBird

答案 4 :(得分:3)

  • 简而言之,AsyncTask中有3个参数

    1. DoInBackground中使用输入的参数(String ... params)

    2. 在OnProgressUpdate(字符串...状态)中显示进度使用状态的参数

    3. 在OnPostExcute(String ... result)

    4. 中使用结果的参数

      注意: - [参数类型可能因您的要求而异]