我一直在为Android开发一段时间,目前正在与我的服务器同步 快速介绍:我已经阅读了有关Sync Adapter的信息并知道它的作用,但我只是想知道它是否是我最好的选择。
在我的应用中,用户可以点击按钮来通知对他来说很重要的事情。点击我想更新服务器以保存数据,并通知他的亲戚。我的问题如下:用户可以点击该按钮多次打开和关闭,所以在这种情况下,我不希望每次用户点击按钮时打开与服务器的通信,它甚至可能不会改变状态它以前的状态。
所以我的问题是:同步适配器对我来说是正确的吗?或者我应该建立自己的类来与服务器通信,该服务器将检查它,以及像Volley一样接收紧急\非紧急。 如果有人能够澄清同步适配器的确切工作,我真的很感激它(它是否符合我的说法?)
如果事情不明确,我很乐意澄清。 提前谢谢。
答案 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);
...
}
...
}