问题标签 [android-asynctask]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3901 浏览

android - Android:AsyncTask 可以在 UI 线程之外的另一个线程中返回吗?

Android 文档说 AsyncTaskpostExecute()在 UI 线程上被调用。我的印象postExecute()是从被调用的线程中execute()调用的:我一直在使用自己的线程的后台服务中使用 AsyncTask,并且在服务线程中调用了 postExecute(),而不是在主线程中。
但是,我最近遇到了一个根本没有调用 postExecute() 的问题,同时引发了异常:“向死线程上的处理程序发送消息”。

究竟是怎样的:
- AsyncTask 只能在主线程中使用吗?
- 如果不是,应该在哪个线程postExecute()中调用:总是 UI 线程,还是execute()调用线程?

谢谢

0 投票
3 回答
10665 浏览

android - onPostExecute 取消 AsyncTask

如果已取消,是否onPostExecute执行?AsyncTask

如果它确实执行了,是否可以肯定地说我应该总是isCancelled在开始时询问任务是否已被取消()onPostExecute,然后再做其他事情?

0 投票
3 回答
11335 浏览

java - 带有 ProgressDialog 的外部 AsyncTask 类 [更新:并返回?]

**更新:(见下文)**我已经环顾了几天,找不到一个直接的答案。有人说可以,有人说可以完成,有人说不能。我对此越来越疯狂。

我想要的只是让 AsyncTaskTask 显示一个外部类的进度条。为此,我传递了您在主类中看到的上下文。但无论我尝试什么,我都会得到NullPointerException

工作代码示例表示赞赏。谢谢

顺便说一句,使用 Android 2.2。

主要的:

异步类.java

更新: 我有一个后续问题:使用上面的代码,是否可以以某种方式将 onPostExecute 方法中的值返回给主类?(对不起,我很笨拙)我尝试过这样的事情:

然后是一个返回字符串的方法。但我不能这样做,因为我得到了:

我能做些什么来解决这个问题?谢谢。

0 投票
2 回答
6200 浏览

android - Android: How to download a .png file using Async and set it to ImageView?

I've got the URL of a .png image, that needs to be downloaded and set as a source of an ImageView. I'm a beginner so far, so there are a few things I don't understand: 1) Where do I store the file? 2) How do I set it to the ImageView in java code? 3) How to correctly override the AsyncTask methods?

Thanks in advance, will highly appreciate any kind of help.

0 投票
2 回答
3293 浏览

java - Activity 的实例变量未在 AsyncTask 的 onPostExecute 中设置或如何将数据从 AsyncTask 返回到主 UI 线程

我正在尝试找出创建 AsyncTask 以从 Internet 检索一些数据然后获取该数据并将其捆绑在 Intent 中并将其传递给新活动(列表显示)的正确方法。所以在第一个活动中,我只有一个 EditText 和 Button。如果发生 OnClick,则应调用任务,完成后数据应捆绑在 Intent 中并传递给下一个 Activity。问题是当我从 onPostExecute 获取结果并将它们设置为主要活动的实例变量时,当任务完成时,该实例变量仍然为空。这是代码的准系统版本:

当我调试应用程序时,我看到 onPostExecute 确实包含一个充满结果的有效 PlacesList,那么为什么在执行任务后实例变量 places 设置为 null?我要从 AsyncTask 错误地“返回数据”?

0 投票
12 回答
33951 浏览

android - AsyncTask 真的在概念上存在缺陷还是我只是遗漏了什么?

我已经调查这个问题几个月了,想出了不同的解决方案,我不满意,因为它们都是大规模的黑客攻击。我仍然无法相信一个在设计上有缺陷的类进入了框架并且没有人在谈论它,所以我想我一定是遗漏了一些东西。

问题出在AsyncTask. 根据文件它

“允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。”

然后该示例继续显示如何showDialog()调用一些示例性方法onPostExecute()。然而,这对我来说似乎完全是人为的,因为显示对话框总是需要对有效的引用Context,并且 AsyncTask绝不能持有对上下文对象的强引用

原因很明显:如果触发任务的活动被破坏怎么办?这可能一直发生,例如因为您翻转了屏幕。如果任务持有对创建它的上下文的引用,那么您不仅会持有无用的上下文对象(窗口将被破坏,任何UI 交互都会因异常而失败!),您甚至可能会创建一个内存泄漏。

除非我的逻辑在这里有缺陷,否则这会转化为:onPostExecute()完全没用,因为如果您无法访问任何上下文,那么此方法在 UI 线程上运行有什么好处?你不能在这里做任何有意义的事情。

一种解决方法是不将上下文实例传递给 AsyncTask,而是传递一个Handler实例。这行得通:由于 Handler 松散地绑定了上下文和任务,因此您可以在它们之间交换消息而不会冒泄漏的风险(对吗?)。但这意味着 AsyncTask 的前提,即您不需要处理处理程序,是错误的。它也似乎在滥用 Handler,因为您在同一个线程上发送和接收消息(您在 UI 线程上创建它并在 onPostExecute() 中通过它发送,它也在 UI 线程上执行)。

最重要的是,即使使用这种解决方法,您仍然会遇到这样的问题,即当上下文被破坏时,您没有它触发的任务的记录。这意味着您必须在重新创建上下文时重新启动任何任务,例如在屏幕方向更改之后。这是缓慢而浪费的。

我对此的解决方案(在 Droid-Fu 库中实现)是维护WeakReferences 从组件名称到它们在唯一应用程序对象上的当前实例的映射。每当启动 AsyncTask 时,它都会在该映射中记录调用上下文,并且在每次回调时,它将从该映射中获取当前上下文实例。这确保您永远不会引用过时的上下文实例,并且您始终可以访问回调中的有效上下文,以便您可以在那里进行有意义的 UI 工作。它也不会泄漏,因为引用很弱,并且当给定组件的实例不再存在时会被清除。

尽管如此,它仍然是一个复杂的解决方法,并且需要对一些 Droid-Fu 库类进行子类化,这使得这是一种非常侵入性的方法。

现在我只想知道:我只是大量遗漏了某些东西还是 AsyncTask 真的完全有缺陷?您使用它的经验如何?你是如何解决这些问题的?

感谢您的输入。

0 投票
2 回答
914 浏览

android - Android 的 AsyncTask 问题

任何人都可以就以下问题提出建议:我正在尝试从 Android 的帮助页面执行代码,但它对我不起作用:

当我执行任务时, doInBackground 被很好地调用,但 onPostExecute 永远不会被调用:(

在具有 2.1 操作系统的 Milestone 上测试

0 投票
1 回答
556 浏览

android - PageAsyncTask endHandler 更新调用页面

我被迫应用 Microsoft 的 PageAsyncTask 对象,这是我的新手(在我一直使用 jQuery AJAX 调用之前)。除了工作完成并调用 endHandler 外,我的一切工作正常,我如何让调用页面更新其内容?

基本上,我的异步函数运行大量数据库操作,并使用 HTML 向调用者报告数据库运行的结果。操作完成后,我想在调用页面上显示这些结果。除了显示结果的调用页面外,我一切正常。

感谢您的帮助。

0 投票
1 回答
925 浏览

java - AsyncTask 不显示 onPreExecute

我有两个 AsyncTask 活动,它们的唯一职责是在 UI 线程上执行 AsyncTask。其中一个效果很好,显示进度条,并更新进度条消息。这适用于我的 SearchActivity,它实际上是一个带有 Google 搜索元数据的搜索活动,用于声明搜索活动。我创建了 AsyncTask 的克隆,只更改了 doInBackground 代码,还克隆了 SearchActivity 并将其命名为 browseActivity。

我启动 BrowseActivity 以获得在单击项目时扩展 listView 的类的结果。我打算让 AsyncTask 的 onPreExecute 代码在 ListView 活动和 ListView 将在 onActivityResult 启动的 ResultActivity 之间显示一个进度条,就像 SearchActivity 一样。正在调用 onPreExcute 代码,但从不显示 ProgressBar。(我以为我在 UI 线程上运行它正确?)

这是浏览活动:

这是开始browseActivity的CategoryActivity(扩展ListActivity)活动:

0 投票
2 回答
62739 浏览

android - 如何使用单独的线程来执行http请求

当用户单击某些按钮时,我有一个应用程序正在执行 HTTP 请求(特别是调用 FogBugz API)。现在,我只是在应用程序启动时创建一个服务,然后在该服务中调用不同的方法来完成请求。但是,当我这样做时,UI 线程中通常会挂起。我看过 AsyncTask,但不确定它会做我想要完成的事情。因为我需要立即解析 HTTP 请求返回的 XML,所以我需要一个能够将此数据返回给 UI 线程的进程。ASyncTask 能做到这一点,还是有其他方法?

其他几个人调用此方法来执行 HttpRequest。一旦返回输入流,其他方法就会解析特定信息。