【问题标题】:One "application", multiple packages, database synchronisation一个“应用”,多个包,数据库同步
【发布时间】:2011-03-12 02:15:22
【问题描述】:

总结:多个SQLite数据库与服务器端顺序同步。

我正在开发一个必然是模块化的 Android 应用程序:我们有一个启动器,可以根据用户的选择触发 Intent,以启动不同的应用程序模块(单独的可安装包)。就像现在一样,每个模块都有自己的 SQLite 数据库,并且工作正常。我分配的任务需要使用 MS Sync Framework 4.0(当前为 10 月 CTP)在手持设备和服务器端(SQL Server 2008 R2)之间进行数据同步。我根据 Sync Framework 规范开发了 android lib,并且也可以。

我遇到的问题是,由于这种松散耦合的设计(以及其他一些限制),我需要在启动器中有一个按钮,这会强制所有模块一个接一个地同步它们的数据库(顺序无关紧要现在)。

我目前的方法是在每个模块中继承一个抽象的 BroadcastReceiver & Service(我现在才发现 IntentService)类。因此,在启动器中,我广播意图,每个模块使用自定义的 BroadcastReceiver 来获取它,并再次使用自定义的服务同步其数据库......并行。我检查了订购的广播,但由于我有一项服务在做实际工作,它并没有真正帮助。我目前能想到的唯一其他方法是拥有一个系统范围的互斥锁并使用它来锁定每个服务中的同步调用。

这是我的第一个与 Android 相关的任务,所以可能有更好的方法来解决这个问题,如果这能让我们的团队未来的生活更轻松一点,我不会从重新设计同步部分中跑出来。

[EDIT] 所以看起来 Java 不支持命名互斥体。

[EDIT2] 模块(或单独的可安装包)是指每个模块的不同 APK。因此,当启动一个模块时,您实际上会为它启动一个新进程。

【问题讨论】:

  • 这是一个具有挑战性、有趣的情况!我认为在同步时排序确实很重要。您需要从一开始就牢记这一点来设计您的方法。
  • @TheCottonSilk 但是每个模块都是一个单独的 APK,所以它在自己的进程中运行,Java 不支持系统范围的互斥锁(至少我的 google-fu 告诉我)。我正在寻找替代方案,例如插座/管道锁等。
  • 每个模块都在一个单独的 APK 中...您能否详细说明一下要求,因为到目前为止还没有问题,或者我可能无法理解它。一个包含许多模块的应用程序:我认为所有功能都在一个 APK 中。
  • @TheCottonSilk 添加了说明。为误导性描述道歉。
  • 这是一个链接 (senior.ceng.metu.edu.tr/2009/praeda/2009/01/11/…),它将 Android 描述为 RESTFul 客户端并访问远程数据库。可能会有用。

标签: android architecture service


【解决方案1】:

使用“同步”,您可以在 java 中实现互斥锁,如下所示。这是一个非常小的例子。

private final Object mutex = new Object();
...
synchronized (mutex) {
    if (myCondition) {
        try {
            mutex.wait(n);
        } catch (XYZException e) {
            throw new PQRException(“Wait() issue!”, e);
        }
    }
}
...

【讨论】:

    【解决方案2】:

    最后我不得不像这样使用服务器套接字来实现全局锁定:

    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();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 2015-10-07
      • 2018-11-22
      • 2021-11-06
      • 1970-01-01
      相关资源
      最近更新 更多