3

我已经为 Android 开发了一段时间,目前正在与我的服务器同步。
快速介绍:我已经阅读过 Sync Adapter 并且知道它的作用,但我只是想知道它是否是我的最佳选择。

在我的应用程序中,用户可以单击一个按钮来通知对他来说很重要的事情。单击时,我想更新服务器以保留数据,并通知他的亲戚。我的问题如下:用户可以多次单击该按钮来打开和关闭它,因此在这种情况下,我不想在每次用户单击按钮时都打开与服务器的通信,它甚至可能不会从它以前的状态。

所以我的问题是:同步适配器对我来说是正确的吗,还是我应该建立自己的课程来与将检查该问题的服务器对话,并像 Volley 那样接收紧急\非紧急的。如果有人能澄清 Sync Adapter 的确切工作,我将不胜感激(它是否符合我所说的?)

如果有不清楚的地方,我很乐意澄清。提前致谢。

4

4 回答 4

1

Android 同步框架应该非常适合您使用。如果您根据需要标记同步,系统将不会立即启动它,而是会延迟一小段时间。这样,如果用户切换回按钮,您将能够注意到值没有改变。旁注:如果您使用 a ,它会在数据更改时自动ContentProvider通知。SyncAdapter如果需要,您还可以手动触发同步。

同步框架所做的只是调用一个方法(onPerformSync)。您可以随意实现它。如果您认为最后一个太接近了,您可以跳过同步,或者查找数据是否真的发生了变化,或者它恢复到原始值(例如,您可以将“最后同步”的值保留在数据库中,然后您可以比较它到您onPerformSync方法中的当前值。如果相同,则无需更改)。

奖励:您将节省电池电量,因为同步框架尽可能按顺序运行多个同步,您的用户将能够在一个集中的位置管理他们的帐户(Android 设置),禁用系统范围内的同步(想想索尼的stamina-mode,设置每个 SyncAdapter 在活动时暂停)。

于 2013-10-21T15:38:30.197 回答
0

您也可以采取另一种方法,从您的服务器推送到设备,您的应用程序不必不时要求更新,而是应该告诉“嘿,我有东西给你”的服务器。

看看谷歌云消息传递。另一方面,如果您更喜欢用户应该特别要求他的更新的方法,那么您实际上不需要打扰同步适配器 - 当然,这取决于您的应用程序的要求。

尽管如此,我还是建议你看看 GCM,它更干净,更优雅,服务器通知然后继续询问。

于 2013-10-22T15:27:40.523 回答
0

内容提供者数据更改时运行同步适配器

public class MainActivity extends FragmentActivity {
...
// Constants
// Content provider scheme
public static final String SCHEME = "content://";
// Content provider authority
public static final String AUTHORITY = "com.example.android.datasync.provider";
// Path for the content provider table
public static final String TABLE_PATH = "data_table";
// Account
public static final String ACCOUNT = "default_account";
// Global variables
// A content URI for the content provider's data table
Uri mUri;
// A content resolver for accessing the provider
ContentResolver mResolver;
...
public class TableObserver extends ContentObserver {
    /*
     * Define a method that's called when data in the
     * observed content provider changes.
     * This method signature is provided for compatibility with
     * older platforms.
     */
    @Override
    public void onChange(boolean selfChange) {
        /*
         * Invoke the method signature available as of
         * Android platform version 4.1, with a null URI.
         */
        onChange(selfChange, null);
    }
    /*
     * Define a method that's called when data in the
     * observed content provider changes.
     */
    @Override
    public void onChange(boolean selfChange, Uri changeUri) {
        /*
         * Ask the framework to run your sync adapter.
         * To maintain backward compatibility, assume that
         * changeUri is null.
        ContentResolver.requestSync(ACCOUNT, AUTHORITY, null);
    }
    ...
}
...
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    // Get the content resolver object for your app
    mResolver = getContentResolver();
    // Construct a URI that points to the content provider data table
    mUri = new Uri.Builder()
              .scheme(SCHEME)
              .authority(AUTHORITY)
              .path(TABLE_PATH)
              .build();
    /*
     * Create a content observer object.
     * Its code does not mutate the provider, so set
     * selfChange to "false"
     */
    TableObserver observer = new TableObserver(false);
    /*
     * Register the observer for the data table. The table's path
     * and any of its subpaths trigger the observer.
     */
    mResolver.registerContentObserver(mUri, true, observer);
    ...
}
...

}

于 2013-10-27T06:29:03.903 回答
0

当设备上的数据发生变化时运行同步适配器。此选项允许您将修改后的数据从设备发送到服务器,如果您需要确保服务器始终拥有最新的设备数据,该选项尤其有用。如果您实际上将数据存储在内容提供程序中,则此选项很容易实现。如果您使用的是存根内容提供程序,则检测数据更改可能会更加困难。

运行同步适配器以响应用户操作。但是,为了提供最佳的用户体验,您应该主要依靠自动化程度更高的选项之一。

您可以通过设置运行之间的等待时间,或在一天中的某些时间运行它,或两者兼而有之,定期运行同步适配器。定期运行同步适配器可以让您大致匹配服务器的更新间隔。

于 2013-10-27T06:22:18.477 回答