【问题标题】:Android Make a new Async task have priority over others in background or Dropbox Core API issueAndroid 使新的异步任务在后台或 Dropbox Core API 问题中优先于其他任务
【发布时间】:2015-01-02 22:41:08
【问题描述】:

我正在使用 Android 中的 Core API 从 Dropbox 加载多张照片,并在发出请求时对其进行序列化。

我将缩略图显示在网格视图中,当用户单击其中一个时,它会转到另一个活动,它会从服务器获取完整的 res 版本。

这很好,但只有在其他所有获取缩略图的异步任务完成后,才会开始下载高分辨率版本。

所以我想知道的是,这是 Dropbox Core API 的限制吗?或者有没有办法让高分辨率异步任务优先于其他任务,以便立即下载,然后其他任务可以恢复。

【问题讨论】:

  • 我建议您使用Picasso - 它包含使用最简单的 API 实现的所有与图像加载相关的内容。
  • 我很想使用 Picasso 或 UniversalImageLoader。问题是我更喜欢使用使用帐户和相对文件路径的保管箱方法,而不是使用公共链接,这也不是很容易获得。有没有办法在 Picasso 或 UL 中使用 dropbox api?
  • Picasso 支持自定义 Downloader 实现,RequestHandler 在 2.4 中作为 beta 功能引入,您可以在其中定义自定义 Uri 处理程序。以下是我发现的一些关于使用 Dropbox API 实现它们的博客文章:blog.jpardogo.com/custom-picasso-downloaderblog.jpardogo.com/requesthandler-api-for-picasso-library
  • 太好了。会看看。我从没用过毕加索,只用过 UL,但会试一试。

标签: android multithreading android-asynctask dropbox-api


【解决方案1】:

这是由于异步任务的实际工作方式。它们不会在 3.0+ 上并行运行(他们过去一直到 3.0),因为太多的新手开发人员无法在没有错误的情况下并行编程,所以谷歌决定改变它。相反,异步任务以 FIFO 顺序在单个线程上运行。

但是,您可以覆盖它。不要调用 asynctask.execute(),而是调用 asynctask.executeOnExecutor() 并使用 THREAD_POOL_EXECUTOR。这将在自己的线程上并行执行。我相信有一个线程帽,但它至少会让几个并行运行。

如果线程上限成为问题,您始终可以选择使用线程而不是使用异步任务。您需要自己做一些工作来执行 onPostExecute,但这并不难。如果您正在创建自己的线程,则可以弥补操作系统的限制。

【讨论】:

  • 我明白了。我实际上认为至少有一些异步任务是并行运行的。我会按照你的建议尝试使用 Executor,如果还不够,我会尝试自己的实现。谢谢。
  • 另外,有没有办法改变异步任务的执行顺序,不管有没有执行器?
  • AsyncTask提供的THREAD_POOL_EXECUTOR有一个工作队列,限制为128个任务,但你可以定义自己的ThreadPoolExecutor,没有任何限制,甚至可以改变队列AsyncTask.THREAD_POOL_EXECUTOR 或将另一个设置为默认值。
  • @corsair992 不错,没想到这么高。那么如果它成为一个问题,你可能做错了什么。
  • @androidpotato7: AsyncTask 不允许你指定任务优先级,但是稍微修改一下就可以了。看到这个问题:stackoverflow.com/questions/24461534/…
猜你喜欢
  • 1970-01-01
  • 2021-07-02
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 2022-09-25
  • 1970-01-01
相关资源
最近更新 更多