- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想使用 AlarmManager.setInexactRepeating(...) 在 Android 应用程序中设置网络任务.
我已经在 AndroidManifest.xml 中使用以下条目注册了我的 BroadcastReceiver:
<receiver
android:name="com.vandenmars.colortrek.analytics.CTAUploadService"
android:process=":sync"/>
现在,如果我简单地使用阻塞 HttpURLConnection 运行我的网络请求来自 onReceive() , 我得到一个 NetworkOnMainThreadException !?!?
奇怪...我认为 AlarmManager 的全部意义在于在后台线程上调用 onReceive...
这让我想到了问题 1:
是否可以强制 AlarmManager 在后台线程而不是主线程上调用 onReceive?我是否需要在 AndroidManifest.xml 中声明不同的内容?
我试图通过设置 AsyncTask 来解决这个问题对于我在 onReceive 中的网络请求,异常消失了。我现在遇到的问题是,某些 Android 设备需要永远 来使网络请求超时,而该网络请求由于间歇性网络问题或服务器问题而应该会失败。所以,现在(如果我将重复间隔设置为很小的值)我有一堆 AsyncTasks 堆积在队列中,它们试图完成相同的请求并挂起,等待第一个请求失败。当网络问题得到解决时,所有待处理的 AsyncTask 都会在大量的网络请求中一个接一个地崩溃。
为了解决这个问题,我尝试简单地在代码中的实例变量中保留一个标志,以防止在前一个 AsyncTask 完成之前安排另一个 AsyncTask。不幸的是,这没有按预期工作,因为 AlarmManager 的每次调用都会创建我的 BroadcastReceiver 的新实例,重置标志...
如果我制作这个标志,它确实有效 static
将它附加到类本身而不是它的实例,但这引出了问题 2:
我可以依赖这种方法,还是有可能以这样一种方式调用 BroadcastReceiver,即有两个进程(?)左右处于 Activity 状态,它们具有不同的静态变量“实例”?
最后是问题 3:
如果我不能依赖这种方法,有没有好的替代方法?
我宁愿不必使用此标志访问磁盘,因为我不想用完闪存写入周期,如果我不需要...
PS:我意识到有 other ways to do networking in the background ,比如 GCM、JobScheduler、SyncAdapters,...可能会为我解决这个问题,或者被认为是“正确的方法”。不幸的是,它们都有某种形式的问题(粗略的权限、奇怪的系统更改、API 级别要求……),使它们对我毫无用处。因此,我确实需要为此使用 AlarmManager。
最佳答案
您的一个问题已得到解答:https://stackoverflow.com/a/9687668/1738090
但是,您已经问了几个问题,所以也许我可以在这里提供一些帮助,因为我最近有一些使用 AlarmManager 的经验。
Is it possible to force AlarmManager to call onReceive on a background thread rather than a Main thread? Do I need to declare something differently in AndroidManifest.xml?
是的,您可以创建一个实现自定义 Handler 的服务. Handler 可用于触发 AlarmManager PendingIntent。您用于此 Intent (用于捕获 AlarmService 触发器)的广播接收器然后可以在处理程序的后台接收和执行逻辑,或者它可以通知 UI 触发事件。如果您在这部分需要更多帮助,请告诉我。
Can I rely on this approach or is it ever possible that a BroadcastReceiver is called in such a way that there are two processes (?) or so of it active that have different "instances" of static variables?
如果您担心在幕后运行多个警报 Intent 实例,那么我强烈建议您确保保留在 AlarmManager .set() 中使用的 PendingIntent 实例
方法调用。虽然我之前没有使用过 setInexactRepeating()
,但我知道如果您使用相同的保留 Intent 多次调用 .set() 方法调用,那么它只会重置警报服务.该服务知道要跟踪 Intent 实例并重置警报,而不是创建多个警报进程。我还建议查看有助于更严格交付保证的较新 API:setWindow(int, long, long, PendingIntent)和 setExact(int, long, PendingIntent)
If I can't rely on this approach, is there a good alternative?
听上去,您正在尝试在应用程序的后台发送/接收数据。就您的问题而言,听起来您正在尝试在您的应用在后台更新其数据时手动处理调度。
我强烈建议在这种情况下使用 SyncAdapter。除了更简单的开发方法之外,使用 SyncAdapters 而不是 IntentService + BroadcastReceiver 方法还有很多好处:http://developer.android.com/training/sync-adapters/index.html (包括改善电池生命周期,一般而言)
希望这对您有所帮助!
关于android - 如何从 Android AlarmManager 回调执行网络 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33884701/
我对 Android 很陌生,如果问题重复,请避免并发送链接。有三个 Activity A、B 和 C。 Activity A 获取一个用户名,我想在 Activity C 中显示该用户名,但我想先运
我正在尝试制作记事本应用程序,因此每次打开新笔记时,布局都会相同。另外, Activity 的数量(新注释)不应定义得尽可能多 最佳答案 如果 Activity 始终相同,您可能应该创建一个适配器,允
我有 3 个 Activity 。 主窗口 5 个按钮 在按钮的主窗口中按下此窗口打开(将其称为父窗口) 在父窗口按钮上按下此窗口打开调用它作为结束子窗口。 现在从子窗口我从父窗口获取值如下:
我遇到了一个 Activity backstack 问题。假设我的后台有 5 个 Activity :比如 Activity A、 Activity B、 Activity C、 Activity D
我正在寻找必须具有以下附加特征的 JMS 提供程序: 采用多代理,所有代理都必须处于事件状态(无单点故障) 仅在两台机器上进行扩展就足以满足我们的需求 能够保证订购(如果 1 个生产者 + 1 个消费
假设,我有一个由 TabHost 组成的选项卡 Activity 。 TabHost 包含 2 个选项卡,每两个选项卡都有一个 Activity 组。每个 Activity 组包含一项 Activit
我正在开发一个应用程序,我需要根据某些操作导航到特定 Activity 。这是一张图片 我的第一个 Activity 是 ReadingActivity。基于某些操作,用户将被带到 NewProjec
我创建了一个与服务器异步通信的应用程序。当应用程序发出服务器请求时,将创建一个带有“正在加载”通知的新对话框( Activity )。主要 Activity 实现了处理服务器响应的方法,我想在主要 A
我想在我的所有应用程序 Activity 中显示相同的选项菜单。我创建了一个实现菜单的通用 Activity ,并且我所有的进一步 Activity 都扩展了它。 问题:当我需要扩展其他特定 Acti
我有四个 Activity ,即 java 文件 - Activity1.java、activity2.java、activity3.java、activity4.java 和 xml 文件 - Ac
我有两个 Activity 。我想将数据从第二个 Activity 发送到上一个 Activity 。第一个 Activity 有自定义 ListView 和 bean 类。当我点击第二个 Activ
根 Activity 是堆栈中当前的第一个 Activity 还是 list 中指定为启动 Activity 的 Activity ? 支持应用程序 P 在启动时启动 Activity A。然后 A
你好 我想知道您在绘制 Activity 图选择“Activity ”时考虑了哪些关键点? 您如何从要建模的问题中选择 Activity ? 谢谢 最佳答案 Activity 图用于对正在开发的系统和
如何从主 Activity 启动 Activity 并在子 Activity 返回主 Activity 中退出操作后返回主 Activity ? 我已将子 Activity 作为启动器 Intent
我的工作流程如下: 登录 Activity -> ActivityB -> ActivityC -> ActivityD 我想将数据从LoginActivity传递到ActivityD,但不直接传递到
我之前曾尝试获得此问题的答案,但找不到可以解决我的问题的答案。我正在制作保存圆盘高尔夫球分数的应用程序。我的 MainActivity 有 4 个按钮。新比赛、恢复比赛、类(class)和球员。 At
我有一个 tts 非 UI 类和 Activity 类。现在在 Activity 类中,我有一个按钮,用户可以从中选择男声或女声,具体取决于我想要将字符串传递给 tts 类的选择,然后一次tts 类根
问题有点复杂,首先, Activity A 和 Activity B 的 list 中都有 android:noHistory = true 。我有一个自定义 serialized 类,假设 MyCl
在我的应用程序中,我有两个 Activity (AuthenticationActivity 和 MainActivity),每个 Activity 都有一个导航图和大量 fragment 。我创建了
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How can i use compose email activity in tabView? 我想在选项
我是一名优秀的程序员,十分优秀!