摘要:顺序同步多个SQLite数据库与服务器端。
我正在开发一个必然是模块化的Android应用程序:我们有一个启动程序,根据用户的选择触发意图,启动不同的应用程序模块(单独的可安装程序包)。就像现在一样,每个模块都有自己的SQLite数据库,并且工作正常。我分配的任务要求使用MS Sync Framework 4.0(目前是10月CTP)在手持设备和服务器端(SQL Server 2008 R2)之间进行数据同步。我根据Sync Framework规范开发了android lib,它也有效。
我遇到的问题是,由于这种松散耦合的设计(以及其他一些限制),我需要在启动器中有一个按钮,强制所有模块逐个同步它们的数据库(顺序无关紧要)现在)。
我目前的做法是拥有一个抽象的BroadcastReceiver&我在每个模块中继承的服务(我现在只发现了IntentService)类。因此,在启动器I广播意图中,每个模块使用定制的BroadcastReceiver进行拾取,并使用自定义服务同步其数据库...并行。我已经检查了有序的广播,但由于我有一项服务在做实际的工作,它并没有真正的帮助。我目前唯一能想到的另一种方法是使用系统范围的互斥锁并使用它来锁定每个服务中的同步调用。
这是我的第一个Android相关任务,所以可能有更好的方法来解决这个问题,如果这让我们的团队未来生活变得更轻松,我就不会重新设计同步部分。
[ EDIT ]所以看起来Java不支持命名的互斥锁。
[ EDIT2 ]通过模块(或单独的可安装软件包),我为每个模块指的是不同的APK。因此,在启动模块时,您实际上会为它启动一个新过程。
答案 0 :(得分:0)
使用'synchronized'可以在java中实现互斥,如下所示。这是一个非常小的例子。
private final Object mutex = new Object();
...
synchronized (mutex) {
if (myCondition) {
try {
mutex.wait(n);
} catch (XYZException e) {
throw new PQRException(“Wait() issue!”, e);
}
}
}
...
答案 1 :(得分:0)
最后,我必须使用服务器套接字实现全局锁定,如下所示:
ServerSocket mServerSocket;
/**
* Simulates global locking using server socket
* @return If lock was successful
*/
private synchronized boolean lock() {
try {
Log.v(serviceName, "Trying to acquire a lock...");
// any port from 49152 through 65535 should work
mServerSocket = new ServerSocket(51515);
return true;
} catch (IOException ioe) {
return false;
}
}
/**
* Simulates global unlocking
*/
private synchronized void unlock() {
try {
Log.v(serviceName, "Releasing a lock.");
if (mServerSocket != null) {
if (!mServerSocket.isClosed()) {
mServerSocket.close();
}
mServerSocket = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}