与服务器同步

时间:2013-10-18 14:56:32

标签: android android-syncadapter server-communication

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

在我的应用中,用户可以点击按钮来通知对他来说很重要的事情。点击我想更新服务器以保存数据,并通知他的亲戚。我的问题如下:用户可以点击该按钮多次打开和关闭,所以在这种情况下,我不希望每次用户点击按钮时打开与服务器的通信,它甚至可能不会改变状态它以前的状态。

所以我的问题是:同步适配器对我来说是正确的吗?或者我应该建立自己的类来与服务器通信,该服务器将检查它,以及像Volley一样接收紧急\非紧急。 如果有人能够澄清同步适配器的确切工作,我真的很感激它(它是否符合我的说法?)

如果事情不明确,我很乐意澄清。 提前谢谢。

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

查看Google Cloud Messaging。另一方面,如果您更喜欢用户应该特别要求更新的方法,那么您不需要为同步适配器而烦恼 - 当然,这取决于您的应用程序的要求。

不过,我建议你看看GCM,它更干净,更优雅,服务器通知然后继续询问。

答案 2 :(得分:0)

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

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

您可以定期运行同步适配器,方法是设置在运行之间等待的时间段,或者在一天中的某些时间运行它,或者两者都运行。定期运行同步适配器可以大致匹配服务器的更新间隔。

答案 3 :(得分: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);
    ...
}
...

}