- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个扩展 IntentService 的类,比方说 A 类,然后我还有 2 个类,如 B 类和 C 类,这些类扩展了 A 类。原因是因为我想初始化 A 类中的所有内容这样代码就可以在类 B 和 C 中重用。所以类 B 和 C 的 onHandleIntent
方法如下所示:
@Override
protected void onHandleIntent(Intent intent) {
super.onHandleIntent(intent);
//Specific init stuff
}
我想做的只是在类 A 的构造函数或 onHandleIntent
中进行一些并发检查。例如,当使用方法 x 时(无论哪个类使用它)我希望能够标记正在使用的该方法。有时,一种方法使用 Handler.postDelayed 来调度另一个线程,因此我想确保该标志保持在使用状态,直到 thead 工作完成。
到目前为止,听起来似乎可以通过共享单例轻松完成,但是每个类都有自己的AlarmManager
,它扩展了BroadcastReceiver
,因此使用共享单例不会不能真正起作用,因为不能保证单例的生命周期存在。
我能想到的唯一解决方案是使用数据库或本地文件系统,这听起来很愚蠢。那么是否有另一种方法可以标记由 AlarmManager
触发的不同 IntentService
之间的并发方法?
为了给出一个清晰的图像,我想举一个 A 类、B 类和 C 类的例子
public class A extends IntentService {
public A(String name) {
super(name);
//initialise objects here
}
@Override
protected void onHandleIntent(Intent intent) {
//initialise objects that uses intent here
}
protected synchronized void methodA() {
//wait until flagB is free
flagA = in_use; //Flag something as being in use here
//change some objects here
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//do some stuff with objects
flagB = not_in_use; //Flag something as being free here
}
}, (1000 * 45));// 45secs
}
protected synchronized void methodB() {
if (flagA == not_in_use) {
flagB = in_use;
//do some stuff with objects
flagB = not_in_use;
}
else {
//do something else
}
}
public class B extends IntentService {
public A(String name) {
super("B");//Super initializes everything
}
@Override
protected void onHandleIntent(Intent intent) {//This will run every 30 minutes
super.onHandleIntent(intent);
methodA();
}
}
public class C extends IntentService {
public A(String name) {
super("C");//Super initializes everything
}
@Override
protected void onHandleIntent(Intent intent) {//This will run every 45 minutes
super.onHandleIntent(intent);
methodB();
}
}
所以基本上B类和C类不包含任何私有(private)类。我想做的就像上面的例子一样,标记事物。问题是正如我提到的,如果它只是一个静态字段,那么静态字段可能不会保留在内存中,因为 Android 操作系统可以杀死任何不活动的内容以节省内存。
最佳答案
What I want to do is simply do some concurrency checks at class A's either constructor
不要在构造函数中阻塞。创建对象应该是一个自由的操作。对于 IntentService
,您可能会收到 ANR,因为该对象是从主线程内构造的。
or onHandleIntent
是的。那将是你可以这样做的地方,因为那是实际发生事情的地方。而且它是在后台线程中执行的,因此在这里阻塞是可以的。
要在类(包括子类)的多个实例之间进行同步,您需要使用静态
的东西,因为这是多个实例“共享”的唯一共同的东西。
也(可能)不需要在应用程序的生命周期之外进行同步。如果您的应用程序进程被终止并从 AlarmManager
重新启动,您将有一个新的单例可以使用。之前发生的任何事情都已经死了,所以没有任何事情可以并行发生。
例如使用 A 的 .class
对象进行同步
public class AService extends IntentService {
public AService() {
super("AService");
}
@Override
protected void onHandleIntent(Intent intent) {
synchronized (AService.class) {
// magic happens here.
}
}
}
class BService extends AService {
void foo() {
synchronized(AService.class) {
// we can't be in here if another intentservice is within above block.
}
}
}
只要这些服务在同一应用程序进程中运行(即每个不定义额外进程的简单应用程序),这就确实有效。 static
可在应用程序中的任何位置全局访问。
使用例如外部锁定如果您有多个进程,则需要文件系统,因为它们根本无法访问彼此的对象。
除了同步
之外,查看java.util.concurrent
以获得更强大/更好的同步方式。例如。 `信号量
和 ReentrantLock
(大致相当于同步
)
I want to make sure that flag is kept as in use until the thead work is finished.
如果您的应用程序被终止,并且尚未完成,您将必须重新启动工作。因此,在应用程序的生命周期之外保留“工作进度标志”是没有意义的。并且static
(例如您的单例)在运行时工作正常。
关于java - Intent 服务并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21429428/
我们正在创建一个 n 层 Silverlight LOB 应用程序,并且正在考虑使用 .NET RIA 服务。我们不清楚这与我们当前的 WCF 服务 API 的关系在哪里。我们当前的架构是: 银光
上下文:我在celery + rabbitmq堆栈上有一个主工作系统。 系统已docker化(此处未提供worker服务) version: '2' services: rabbit:
我是 Windows Azure 新手,我正在尝试将我的 Web 应用程序部署到 Windows Azure。在我的应用程序中,我使用了一些 Web 服务,现在我想知道如何在 Windows Azur
因此,根据我对服务的了解,自定义对象似乎是写入服务以返回数据的方式。如果我正在编写将用于 1) 填充数据库或 2) 为网站提供信息的服务,是否有返回数据集/数据表而不是包含所有这些的自定义对象列表的用
我在 google 和 stackoverflow 上都找过答案,但似乎找不到。我正在尝试将 azure 实验的输出获取到应用程序。我使用 ibuildapp 和谷歌表单制作了该应用程序。如何使用 g
我不小心删除了 kubernetes svc: service "kubernetes" deleted 使用: kubectl delete svc --all 我该怎么办?我只是想删除服务,以便
我正在努力确定解决网络服务问题的最有效方法。 我的情况:我正在开发一个 Android 应用程序,它通过 Web 服务从 mysql 数据库(在我自己的服务器 PC 上)存储和检索数据。用户按下提交按
我一直在翻阅 Android 文档,我很好奇。什么时候绑定(bind)服务而不是不绑定(bind)服务?它提供了哪些优点/限制? 最佳答案 When would you bind a service
我试图从架构的角度理解 hive,我指的是 Tom White 关于 Hadoop 的书。 我遇到了以下关于配置单元的术语:Hive Services、hiveserver2、metastore 等。
我的问题:安装服务后我无法导航到基地址,因为服务不会继续运行(立即停止)。我需要在服务器或我的机器上做些什么才能使 baseAddress 有效吗? 背景:我正在尝试学习如何使用 Windows 服务
我正在努力就 Web 服务的正确组织做出决定。我应该有多个 ASMX 来代表 Web 服务中的不同功能,还是应该有一个 ASMX? 如果我有多个 ASMX,这不构成多个 Web 服务吗? 如果我只有一
我正在从事一个在 azure 平台上提供休息服务的项目。该服务由 iPhone 客户端使用,这是选择其余方法的重要原因之一。 我们希望通过 AccessControlService(ACS) 并使用
我是 Ionic 新手,正在使用 Ionic 3.9.2 我有几个终端命令来为我的 ionic 应用程序提供服务,但是,我没有发现这两个命令之间有任何区别。 ionic serve 和 ionic s
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
作为项目的一部分,我期待着问这个问题。我过去有开发和使用 Web 服务的经验,并且非常熟悉这些服务。但是,有人告诉我,作为下一个项目的一部分,我将需要使用“安全”的 Web 服务。您能否提供一些见解,
我浏览了很多关于这个问题的信息,但找不到解决方案。这里的问题是,我想使用 Apache Cordova 和 Visual Studio 连接到 wcf。因此,如果有人找到合适的工作解决方案,请发布链接
我在 Windows 服务中托管了一个 WCF(从 MS 网站示例中选取),我可以使用 SOAP UI 访问和调用方法。但是,当我尝试使用 jquery 从 Web 应用程序调用相同的方法时,我不断收
我们构建了一个 Android 应用程序,它从 Android 向我的 PHP 服务器发送 HTTP 请求。作为响应,Web 服务将 JSON 对象发送到 Android 应用程序以显示结果。 就像其
我想在 android 应用程序中调用 soap web 服务,它需要一个枚举值作为参数,它是一个标志枚举。如何从 Android 应用程序将一些值作为标志枚举传递给此 Web 服务方法? 我使用 K
我尝试在模拟器上安装 Google Play。我已按照 Google Dev Site 中的说明进行操作. 使用 ADV 管理器似乎没问题,设备的目标是 Google API 版本 22,但是当我运行
我是一名优秀的程序员,十分优秀!