问题标签 [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 投票
61 回答
498705 浏览

java - 如何检查Android上的互联网访问?InetAddress 永远不会超时

我有一个AsyncTask应该检查对主机名的网络访问。但是doInBackground()永远不会超时。有人有线索吗?

0 投票
12 回答
74833 浏览

android - Android 上的 AsyncTask 和错误处理

我正在将我的代码从 using 转换HandlerAsyncTask. 后者非常擅长它的工作 - 在主 UI 线程中异步更新和处理结果。我不清楚的是,如果AsyncTask#doInBackground.

我这样做的方式是有一个错误处理程序并向它发送消息。它工作正常,但它是“正确”的方法还是有更好的选择?

我也明白,如果我将错误处理程序定义为一个活动字段,它应该在 UI 线程中执行。但是,有时(非常不可预测)我会收到一个异常,说明从中触发的代码Handler#handleMessage正在错误的线程上执行。我应该初始化错误处理程序Activity#onCreate吗?放置似乎是多余的,但它执行非常可靠runOnUiThreadHandler#handleMessage

0 投票
1 回答
4346 浏览

android - Android - AppWidgets、AlarmManager 和 AsyncTask

我在使用AlarmManager生成的广播更新应用小部件时运气不佳。这就是我所做的:

初始化AlarmManager_AppWidgetProvider#onEnabled

我还定义了广播接收器,它只监听由AlarmManager. 当更新被触发时,代码运行AsyncTask进行网络调用。当AsyncTask完成 ( onPostExecute) 时,它使用先前获得的实例AppWidgetManager来更新小部件。这一切实际上运行良好,直到在日志中我看到消息"Process com.foo.myapp (pid 12345) has died",之后AlarmManager再也不会触发另一个更新。

我是否需要进行某种检查以重新启动警报?例如,当用户访问小部件的父应用程序时?如果我的应用在请求过程中死机,如何确保我可以完成长时间运行的任务并返回到小部件?

0 投票
5 回答
25494 浏览

java - AsyncTask 和上下文

因此,我正在使用带有 AsyncTask 类的 Android 开发我的第一个多线程应用程序。我正在尝试使用它在第二个线程中启动地理编码器,然后使用 onPostExecute 更新 UI,但我一直遇到正确上下文的问题。

我在主线程上使用 Contexts 时有点步履蹒跚,但我不确定 Context 是什么或如何在后台线程上使用它,而且我还没有找到任何好的例子。有什么帮助吗?这是我正在尝试做的摘录:

由于上下文不正确,它一直在第六行失败。

0 投票
5 回答
10809 浏览

android - 如何使用 AsyncTask 和 Timer 获取 XML?

为了重复从服务器获取 XML 数据,我尝试按照Mark Murphy 的建议使用 AsyncTask 和 Timer 。

我收到以下错误:

我在 Windows 上使用带有 Eclipse 的 SDK 1.5。

我查看了文档、StackOverflow 和 Android 开发人员组,但我不清楚是什么导致了错误或如何修复它。

我可以一次获取数据——即没有异步和计时器——并通过 SAX 解析它而不会出现问题。

完整的应用程序代码如下。

请原谅任何天真的错误:我对 Android 很陌生。

0 投票
4 回答
29889 浏览

android - Android AsyncTask 上下文行为

我一直在使用 Android 中的 AsyncTasks,我正在处理一个问题。

举一个简单的例子,一个带有一个 AsyncTask 的 Activity。后台的任务没有做任何壮观的事情,它只是休眠了 8 秒。

在 onPostExecute() 方法中的 AsyncTask 结束时,我只是将按钮可见性状态设置为 View.VISIBLE,只是为了验证我的结果。

现在,这非常有效,直到用户决定在 AsyncTask 工作时(在 8 秒的睡眠窗口内)改变他的手机方向。

我了解 Android 活动的生命周期,并且知道活动会被销毁并重新创建。

这就是问题所在。 AsyncTask 指的是一个按钮,并且显然包含对首先启动 AsyncTask 的上下文的引用。

我希望,这个旧上下文(因为用户导致方向更改)要么变为空,并且 AsyncTask 抛出一个 NPE 以引用它试图使其可见的按钮。

相反,没有抛出 NPE,AsyncTask 认为按钮引用不为空,将其设置为可见。结果?屏幕上什么都没有发生!

更新:我已经通过保持WeakReference活动并在配置更改发生时切换来解决这个问题。这很麻烦。

这是代码:

尝试执行它并在 AsyncTask 工作时更改您的手机方向。

0 投票
1 回答
30613 浏览

android - Android - 使用 ArrayAdapter 一次向 ListView 添加和显示项目

我正在使用 ArrayAdapter 将项目添加到自定义 ListView 并在我的 Android 应用程序中显示结果。我遇到的问题是 ArrayAdapter 似乎要等到所有项目都在其中才显示视图。也就是说,当我将项目添加到 ArrayAdapter 并调用 notifyDataSetChanged 时,它不会更新 ListView 以显示添加的项目。它等到所有项目都被添加并在显示项目之前调用 GetView。

我想做的是在将它添加到 ListView 后立即显示该项目。这可能吗?

我相信相关代码如下:

如您所见,即使我在 add 方法之后调用 notifyDataSetChanged,它实际上并没有更新视图。在完成上述循环后,视图最终被更新(根据我所知道的,这是因为在这部分代码完成之前不会调用 GetView)。

我试图重写自定义 ArrayAdapter 的 add 方法,但没有成功,因为我无法访问该方法中的视图。

欢迎任何帮助:)

巴拉

0 投票
3 回答
1765 浏览

android - 如何在 Android 上安排长时间(耗时)的操作?

例如,我们在 SomeActivity 中,该活动有一个按钮,用于调用将文件从一个目录移动到另一个目录(我们称之为作业)。

在黑莓上,我会:

  1. 推送一个不可取消的弹出窗口(对话屏幕),说“请稍候......”
  2. 启动一个完成任务的线程
  3. 在线程完成时关闭弹出窗口

这种方法 99.99% 可以保证我们在任务结束后保持在同一个屏幕上,用户只是看到弹出窗口并等待任务完成。设备旋转或任何不会破坏所需工作流程的东西。

在 Android 上,情况发生了变化。我知道可能会提供 AsyncTask 来解决我的问题。甚至还有一个很好的例子来说明它应该如何使用。但由于无法保证 Activity 实例的生存时间,因此应在 onSaveInstanceState 上取消 AsyncTask(并在 onRestoreInstanceState 上重新启动)。这意味着使用 AsyncTask 并不能保证我们一旦开始就能够完全完成工作。在某些情况下,作为发送创建用户的 http 发布请求,我不想在重新运行 AsyncTask 时遇到“用户已存在此登录”的麻烦。这是可能的,因为 AsyncTask 可以在请求已经发送时被中断(并且服务器实际上正在做它的工作 - 创建一个新用户),但是 AsyncTask 在我们得到响应之前被取消。

Android上是否有任何解决方案来获得上述类似BB的行为?

0 投票
5 回答
18456 浏览

java - When to use a Service or AsyncTask or Handler?

Can someone tell me the TRUE difference?

0 投票
2 回答
644 浏览

java - 我有一个活动。在此活动中,我执行了 AsyncTask ,但它不起作用

基本上,我的目标是:

  1. 每分钟左右不断将纬度/经度发布到我的网站。
  2. 当然,我想在另一个线程中执行此操作,所以它不会弄乱我的 UI 线程。这个 AsyncTask 应该可以解决这个问题……但它引发了一个错误,我不知道为什么。

你能做些什么来实现我的目标?这非常简单……只需在后台每分钟扫描一次位置并发布到网络上。

顺便说一下,我的 onCreate 方法是这样的。基本上就是这样。