Articles of 同步

使用超时多次调用CountDownLatch.await(int)

我使用CountDownLatch来等待来自另一个组件的某个事件(在不同的线程中运行)。 以下方法适合我的软件的语义,但我不确定它是否像我期望的那样工作: mCountDownLatch.await(3000, TimeUnit.MILLISECONDS) otherComponent.aStaticVolatileVariable = true; mCountDownLatch.await(3500, TimeUnit.MILLISECONDS); … 场景应该如下:我等待3秒钟,如果锁存器没有倒计数到0,我用该variables通知另一个组件,然后我等待最多3.5秒。 如果再次超时,那么我不在乎并将继续其他操作。 注意:我知道它看起来不像那样,但上面的场景在我的软件中是完全合理且有效的。 我确实阅读了await(int,TimeUnit)和CountDownLatch的文档,但我不是Java / Android专家,所以我需要确认。 对我来说,所有场景都是有效的: 如果第一次等待成功,则另一次等待将立即返回 如果第一个等待超时,则另一个等待仍然有效; 因此,如果另一个线程注意到静态信号,则第二个await可能会成功返回 两个都等待调用超时(根据我的软件的语义,这很好) 我正确使用等待(…)吗? 即使前一个await(…)在同一个对象上超时,也能以上述方式使用第二个等待(…)吗?

用于在Android中同步应用数据库的云解决方案

我正在开发一个自定义联系人应用程序,它将在SQLite数据库中存储设备上的数据。 由于某些原因,此设备数据库可能与云数据库同步非常重要: 用户可能拥有多个设备,并希望所有设备上的应用数据都是最新的; 用户可能能够从Web应用程序访问这些数据; 由于此应用程序将存储许多图片,因此设备内存不足以容纳所有数据,并且可以使用存档选项将数据仅保留在云数据库中。 存档到云将自动完成旧记录。 可以使用还原选项在需要时下载记录数据。 如您所见,设备数据库将保留一个用户的联系人,云数据库将是一个类似的数据库,但保留所有用户的数据。 因此,此同步中存在逻辑。 这不仅仅是上下复制整个SQLite DB文件的问题。 这必须是行/列级同步。 我想知道我可以使用哪种解决方案来实现这一目标? 是否可以使用Google Cloud或App Engine实现服务器端? 我可以在设备端做什么? 有任何想法吗? 我真的很感激任何答案。 谢谢。

如何在移动应用程序中处理过时的缓存记录

我正在创建一个使用REST API的Android应用程序(我的第一个)。 我使用后台作业来获取内容,我计划使用带有from_id参数的GET请求以获取更多内容。 当然,从API获取的任何内容都存储在SQLite数据库中(我使用的是greendao),而应用程序只使用已经存在的数据,以便更加快捷。 所以,问题是:如果在服务器上更新给定记录会发生什么? 如果一旦读取的记录被缓存,那么应用程序为什么会注意到有同步更改? 哪种策略是可行的解决方案 谢谢。 编辑: 正如Satish P在他的回答中指出的那样,客户端 – 服务器通信是用ETag处理的(我必须添加使用If-Modified-Since的可能性)。 但我主要担心的是如何将其与应用UI混合使用。 鉴于这个例子: 从本地数据库中读取已从REST服务检索但客户端的元素列表,以使应用程序更具响应性。 用户点击其中一个元素并显示详细视图。 同样,数据从本地数据库加载。 我想在这一点上要求使用ETag或If-Modified-Since标头来获取特定记录的GET请求。 碰巧服务器返回修改后的记录,因此修改了本地数据,所以现在是时候更新用户看到的内容了。 问题:如果已填充详细视图,因为远程请求返回时已完成本地数据库读取,如何更新视图? 我不认为只用更新的数据替换当前数据是可以接受的,用户会看到一个突然的变化。

保留来自在线服务的用户数据,以便在Android应用程序上“离线查看”

我有一个网络服务器,用于托管我在Android平板电脑上构建的应用程序的数据。 数据变化相当频繁,但我意识到平板电脑和手机并不总是与数据连接,并且用户已经可以访问他们之前查看过的数据。 我希望应用程序尽可能从Web服务器提取数据,并且当不可能时,从手机上的SQLite服务器(或任何正确的方法)中提取数据。 是否已经制定了实施或实践来实现这一目标? 如果是,那么实现这种function的当前方法是什么? 是否可以采用相同的方法对数据进行更改,然后在数据连接恢复时推送这些更改?

Android后台服务与AlarmManager

有人可以通过Alarm Manager向Android背景服务提供一些简介或更精细的细节吗? 他们有什么不同? 在哪种情况下我应该使用每种? 我正在开发一个需要定期从Web服务下载数据的应用程序。 应用程序具有很少的模块,并且每个模块具有不同的间隔时间段以将数据下载/同步到Web服务。 假设+模块A需要每15分钟同步一次+模块B需要每1小时同步+模块C需要每天同步+模块D需要每周同步+模块E需要每月同步 哪种方法更好? 为什么? 问候

有没有人在Android SyncObserver上实现(或获得更多信息)

我正在开发一个Android应用程序,它与服务器执行后台同步(使用SyncAdapter和身份validation等)。 启动前台应用程序(使用UI)时,可能正在进行后台同步,或者可选择通过UI按钮启动后台同步。 我想要一种“插入”正在进行的后台同步(无论是由系统启动,还是定期同步设置或UI)的方法,并显示它在前台活动中的进度。 ContentResolver文档(http://developer.android.com/reference/android/content/ContentResolver.html)提到了一个神秘的“SyncObserver”,它没有链接到javadoc,也没有记录(我能find)。 还有一些其他页面提到它(http://www.chinaup.org/docs/migrating/m5-0.9/changes/android.content.ContentResolver.html)但我无法find更多相关信息。 有人实施过这种野兽吗? 如果没有,是否有人有关于跟踪前台活动中后台同步进度的示例代码或建议?

SyncAdapter完成后如何通知调用Activity?

在我的Android项目中,我使用自定义SyncAdapter来下载数据并将其存储在本地SQLite数据库中。 public class CustomSyncAdapter extends AbstractThreadedSyncAdapter { public CustomSyncAdapter(Context context, boolean autoInitialize) { super(context, autoInitialize); } @Override public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { // 1) Download data via AsyncTask // 2) Store data via ContentProvider } } 我使用ContentResolver从主Activity调度sychronization,例如… ContentResolver.requestSync(account, Authentication.AUTHORITY, bundle); 同步完成时是否有通知方式通知调用Activity ?

如何从Android中的同步适配器服务访问已经运行的应用程序上下文?

我有一个由几个活动组成的应用程序,我使用应用程序上下文(从应用程序类中使用,并使其持久化)在所有活动之间共享数据和对象。 我使用Application Class而不是后台服务有几个很好的理由,我不会在这里讨论。 我最近还为我的应用添加了自定义联系人同步适配器。 它在相同的包下,在同一个APK中。 因此,我将其设置为访问应用程序上下文,就像我的应用程序中的其他所有内容一样,使其可以访问所有共享数据和对象。 但是,即使它(大多数情况下)有效,它也会创建一个新的Application Context实例。 因此,我的应用程序基本上有两个独立的实例正在运行,并且数据不会在它们之间共享。 我认为问题是我的应用程序永远不会启动同步服务,操作系统会这样做。 我的所有其他活动都是由应用程序启动的,或者主活动在启动时访问应用程序上下文,然后应用程序上下文控制其他所有活动。 有没有办法让同步服务访问现有的应用程序上下文,而不是创建它的新实例? 这是我的应用程序的基本结构: 应用程序 package com.mycomany.myapp; public class MyApp extends Application{ … } 活动1 package com.mycomany.myapp; public class MyActivity1 extends Activity{ MyApp a; @Override public void onCreate(Bundle savedInstanceState){ a = (MyApp) getApplicationContext(); … } } SyncAdapterService package com.mycomany.myapp; public class SyncAdapterService extends Service { private […]

如何使用AlertDialog的返回值

在大多数情况下,我需要用户多次做出选择。(我做了一些事情并为用户做了一个消息框做出选择并继续做其他事情(可能称为块))所以我写了一个常用的函数 public static void ShowMsgDialog(Context self,String title, String msg) 虽然它正确响应了用户的操作,但总是挂起(这意味着当我单击按钮时,前一个操作的值可以通过全局variables的值看到)是否存在任何可以获取消息框的返回值并使用它的函数: int ret = ShowMsgDialog(Context self,String title, String msg); 以下是我的代码: public class MainActivity extends Activity { private Button button1; enum Answer { YES, NO, ERROR}; static Answer choice; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button)findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View […]

什么是Android Studio中的gradle同步?

它是什么? 它做了什么? 我正在开发一个拥有代理的企业,但它无法尝试连接到某个地方。 为什么需要互联网连接? 它使用什么端口? 编辑:用户Caleb的答案是完美的。 我想补充一点,代理也应该在gradle.properties中配置。 像这样的东西: systemProp.http.proxyHost = proxyAddress systemProp.http.proxyPort = portNumber systemProp.https.proxyHost = proxyAddress systemProp.https.proxyPort = portNumber