哪些参数传递给AsyncTask <arg1,arg2,arg3>?


157

我不明白我应该在这里说些什么以及这些论点在哪里结束?我到底应该放什么,它到底要放哪里?我需要包括所有3个,还是可以包括1,2,20?

Answers:


496

Google的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的博客来清除AsyncTask的作用

好吧,典型的AsyncTask类的结构如下:

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

    protected void onPreExecute(){

    }

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

    protected Z doInBackground(X...x){

    }

AsyncTask类中最重要的方法。您必须将所有您想在后台执行的工作放在这里,与主线程放在不同的线程中。在这里,我们有一个来自类型“ X”的对象数组作为输入值(您在标题中看到吗?我们有“ ... extends AsyncTask”这是输入参数的TYPES)并返回该类型的对象“ 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-表示任务正在运行。

待处理 -表示任务尚未执行。

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

有关使用AsyncTask的提示

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

  2. 您不能在另一个AsyncTask或线程内调用AsyncTask。方法execute的调用必须在UI线程中完成。

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

  4. 任务的输入参数可以是一个对象数组,这样您就可以放置所需的任何对象和类型。


20
完美的解释伙计
Kalai.G 2013年

30
比Google更好。
Diolor 2014年

25
+1。SO成员,请注意。这就是您的解释方式。虽然很长,但非常容易理解。谢谢你Kartik。
停靠

3
很好的解释,现在我对Asyntask非常清楚。:)感谢Kartik
Reena 2015年

2
那为我清除了很多东西,很好的答案!
迈克尔

80

我参加聚会太晚了,但认为这可能对某人有所帮助。


7
这种视觉效果非常有帮助。我将开始使用更多类似的视觉效果,以显示当代码流不直接或者技术或模式不常见时,类型及其相关变量如何结合在一起。我希望其他人能做更多的事情。谢谢
肯特·劳里森

精美的视觉效果,还可以为WeakAsyncTask添加吗?
kAmol '18年

1
@kAmol当然,我也会尽力让这WeakAsyncTask
一切

4
有一天,我将其框起来并放在墙上,这样我就不必继续回到此主题以供参考。
马特·罗伯逊

14

把事情简单化!

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

AsyncTask<Input,Progress,Output>

在我看来,当我们试图记住表格中的参数时,造成混乱的主要原因AsyncTask
关键是不要记住
如果您可以可视化任务真正需要执行的操作,那么AsyncTask用正确的签名编写便是小菜一碟。
只需弄清楚您的输入进度输出是什么,您就可以顺利进行了。

例如: 在此处输入图片说明

AsyncTask的心脏!

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

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

所以让我们看一下关系

在此处输入图片说明

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

在此处输入图片说明

向我显示代码
那么如何为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");

1
// show in spinner, access UI elements只是传下来最简单的解释了onProgressUpdate(...):)
VolkanGüven19年

5

请参考以下链接:

  1. http://developer.android.com/reference/android/os/AsyncTask.html
  2. http://labs.makemachine.net/2010/05/android-asynctask-example/

您不能传递三个以上的参数,如果只想传递1个参数,则对其他两个参数使用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


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

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

    2. 显示进度状态的参数用于OnProgressUpdate(String ... status)

    3. 在OnPostExcute(String ... result)中使用结果的参数

    注意:-[参数类型会根据您的要求而有所不同]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.