假设在单击按钮时需要下载一些图像。最好的方法是什么?好,因为您不想中断主/UI线程(并冒着向用户显示ANR对话)首先要在单独的线程上进行下载。然后,下载完成后,您需要再次在UI线程上执行代码,以便用新图像更新UI。也,如果要显示更新进度条,您还需要在UI线程上为每个进度更新运行代码!!

幸运的是,与runOnUiThread方法,这并不太难。但是我们解决这个问题的另一种方法是使用AsyncTask。AsyncTasks为我们提供了一种在单独的线程上进行工作的简单方法,同时在主线程上显示该工作的结果。它处理所有幕后的线程,让我们专注于编写应用程序。

要创建AsyncTask,首先要扩展AsyncTask类。这个类有五个有用的方法,我们可以重写以帮助我们处理任务:

  1. 在执行任务并使用UI线程之前调用onPreExecute。如果您的任务需要任何设置,这是做这件事的地方。
  2. doInBack.(Params...)在onPreExecute完成并使用后台线程之后立即调用。这就是你要工作的地方。
  3. onProgressUpdate(....)在UI线程上调用,用于在任务运行时向用户显示进度(例如,进度)。进度条)。通过调用“publish.”方法,可以触发对“onProgressUpdate”的调用。
  4. onPostExecute(Result)在“doInBack.”完成并使用UI线程之后立即调用。
  5. onCancelled(Result)也使用UI线程,并且仅当任务被取消时才调用。

扩展AsyncTask类时,需要添加角括号,并提供三种类型与您想要用于“doInBack.”的参数相对应,“onProgressUpdate”,以及“onPostExecute”函数。

MyAsyncTask延伸异步任务
             
              {/...}
             

所以对于这个例子,我们想把URL传入“doInBack.”,“onProgressUpdate”的整数,以及指向“onPostExecute”的位图数组。如果我们使用ALT+ENTER让Android Studio实现这些方法,看起来是这样的:

*s只是将数组传递给函数的一种方式。所以“urls”是一个URL对象数组,我们可以通过继续添加更多的URL参数来以一个URL数组开始我们的任务:

新的MyAsyncTask().execute(url1,URL2URL3URL4URL5URL6);;

既然我们已经掌握了任务的要点,让我们开始添加一些代码来下载图像。对于这个示例,使事情变得简单,我们不再使用一堆不同的URL,而是使用一个提供随机图像的URL。因此,以10幅图像开始我们的AsyncTask,我们会有这样的东西:

URL URL =新的网址(网址)“https://placeimg.com/640/480/.”“;;新的MyAsyncTask().execute(url,网址网址网址网址网址网址网址网址URL);;

然后,在“doInBack.”方法内部,我们需要将这些URL转换成位图的数组。我们还应该调用“publish.”方法来触发对“onProgressUpdate”的调用,可以在其中更新ProgressBar。

最后,在“onPostExecute”中,我们应该隐藏进度条,并将我们的位图添加到布局中:

AsyncTasks是一种在单独的线程上进行工作,然后使用该工作的结果更新UI的好方法。然而,如果您的任务确实是下载图像,那么您可能需要查看一下毕加索;这是一个图书馆,使整个过程难以置信地容易为图像!!

也,如果你想了解更多关于Android开发的信息,那么我建议你开始在这里.我们将带您从新手一步一步地了解Android开发人员,并解释一路上的一切。另一方面,如果您正在寻找更高级的东西,并且希望更好地理解什么是线程以及如何使用它们,那么我强烈鼓励您看看我们的线程和服务课程.它会给你所有的信息,你需要感到自信,建立应用程序,确实在后台工作!!

资源