我知道这个问题被问了太多次,但我认为我试图针对的问题有点不同,可能更复杂.
我将开发一个使用RESTful Web服务的应用程序,并且需要满足以下要求:
应用程序应该在列表和详细信息中显示一些书籍,作者和编辑
该应用程序还应该允许搜索一本书
书籍,作者和编辑器是从RESTful Web服务中获取的
每个实体都必须被缓存,这样当我打开一个Activity时,我首先看到旧数据(如果有的话),而新的数据从网络更新.
每次实体更新时,都应通知相关方(ContentObserver?定期Listener实施?)
如果一个呼叫已经在执行(说到api/books/1337或来api/editors),应该通知呼叫者它正在加载数据,并且应该给它一个旧的(如果它存在),就像它是原始呼叫者一样.
一些数据(只有书籍和作者)应每N分钟更新一次(由用户决定),并应通知观察员(SyncAdapter?)
问题:
在观看和研究Virgil Dobjanschi在Google I/O 2010上提出的所有组件之后,我对此表示怀疑:
如何透明地为任何呼叫者处理" 实体更新 "概念?我应该使用ContentObserver在ContentProvider我将要实施?
如果我使用a,ContentObserver我可以轻松地为单个实体设置状态标志(如Dobjanschi所建议的),例如UPDATING,INSERTING依此类推.但是我该如何处理清单呢?说我想要一本书清单,我应该把状态标志放在哪里?我应该将它放在状态表中仅列表吗?如果是这样,我应该观察两个Cursors,一个用于状态,一个用于实际列表(即表/内容URI).如果我要求的实体(尚未存在)或REST调用返回一个404怎么办?我该如何处理回调?
如果我将所有REST方法都放在一个中**SyncAdapter**,我可以"强制" SyncAdapter从网络更新实体/实体列表(并因此将其放入正确的表中)吗?这样,状态标志将是有用的.
可以SyncAdapter在多个实体上工作(实际上,实体列表,因为我想偶尔更新书籍和编辑器),因为它只有一个performSync方法?
如果SyncAdapter用户在设备设置中禁用了我的实现,它将不会更新任何内容(这没关系).但是,如果用户单击"活动"中的"更新书籍"按钮,我仍然可以调用该performSync方法,还是也会被禁用?
rest android android-contentprovider android-syncadapter contentobserver
我有一个同步适配器,正在将联系人与私人服务器同步.它看起来像样本中的SampleSyncAdapter(但当然经过修改以满足我的需求).
我需要为这个同步适配器编写测试.谁能给我一些关于如何编写这些测试的指南?
我坚持测试联系人操作(创建,更新,删除).我如何模拟联系人数据库,以便我可以测试那个而不是真正的联系人数据库?
谢谢
android mocking android-syncadapter android-contacts android-testing
我需要知道如何处理来自Rest Server的syncadapter和分页响应.我正在制作一个检索数据收集的Android应用程序.每个页面都有20个项目,我现在正在一个请求中检索所有项目.我认为我能做到的最好的方法是检索一个页面,例如,滚动到列表视图的末尾,使用syncAdapter发出另一个请求,但我不确定.
我正在寻找如何在REST中处理android的分页,但我没有找到任何有用的东西.我想知道是否有人可以帮助我.
谢谢.
这是我现在如何检索项目的示例.
public ArrayList<ContentProviderOperation> parse(String json) throws IOException, NullPointerException {
final ArrayList<ContentProviderOperation> batch = new ArrayList<ContentProviderOperation>();
AccountManager manager = AccountManager.get(mContext);
Account account = ((KipptApplication)mContext.getApplicationContext()).getCurrentAccount();
String authToken = manager.peekAuthToken(account, AuthenticatorActivity.PARAM_AUTHTOKEN_TYPE);
Header[] headers = new Header[]{
new BasicHeader(KipptConstants.API_USERNAME_KEY,account.name),
new BasicHeader(KipptConstants.API_TOKEN_KEY,authToken)
};
Gson gson = new Gson();
Type responseType = new TypeToken<Response<ClipObject>>() {}.getType();
Response<ClipObject> inbox = gson.fromJson(json,responseType);
List<ClipObject> clips = inbox.getObjects();
String response = null;
String next = inbox.getMeta().getNext();
while(next !=null){
try {
Log.d(TAG,"Fetching more clips from: " + next); …Run Code Online (Sandbox Code Playgroud) 在我的 android 项目中,我有一个同步适配器,可以将数据从 android 设备同步到服务器并且工作正常,但最近我注意到 onPerfomSync 没有在我的 moto g3 android 手机中调用,我不知道是否有在任何其他手机上都有同样的问题,我在其他一些具有不同 android api 级别的三星手机上进行了测试,但没有发现任何问题。我已经配置了用户登录成功时的同步。这是什么原因行为。如果我做错了什么,请纠正我。下面是我的代码。
private void finishLogin(Intent intent) {
String accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
String accountPassword = intent.getStringExtra(PARAM_USER_PASS);
final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE));
if (getIntent().getBooleanExtra(ARG_IS_ADDING_ACCOUNT, false)) {
String authtoken = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN);
String authtokenType = authTokenType;
String refreshToken = intent.getStringExtra(KEY_REFRESH_TOKEN);
Bundle userData = new Bundle();
userData.putString(KEY_REFRESH_TOKEN, refreshToken);
accountManager.addAccountExplicitly(account, accountPassword, userData);
accountManager.setAuthToken(account, authtokenType, authtoken);
accountManager.setUserData(account,KEY_REFRESH_TOKEN,refreshToken);
ContentResolver.setMasterSyncAutomatically(true);
ContentResolver.setSyncAutomatically(account, "com.myexample.mysampleproject", true);
configurePeriodicSync(account, SYNC_INTERVAL, SYNC_FLEXTIME);
try {
} catch (Exception e) {
e.printStackTrace();
} …Run Code Online (Sandbox Code Playgroud) android synchronization android-contentprovider android-syncadapter
我开发了一个需要做两件事的应用程序:
android android-syncadapter android-contacts android-account android-contact-mimetype
问题如下。我有一个有效的 SyncAdapter 和 ContentResolver 设置。onPerformSync当我打开 wifi 但 wifi 没有互联网连接(它连接到 IOT 设备)时,不会触发SyncAdapters 的问题。我有一张 SIM 卡,可以使用蜂窝数据。在应用程序中,我设置了 NetworkManager,因此我请求蜂窝数据,如下所示:
val req = NetworkRequest.Builder()
req.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
req.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
Run Code Online (Sandbox Code Playgroud)
如果我创建一个 API 请求而不是触发ContentResolver.requestSync它正常工作。
此代码在华为平板电脑上也能正常工作,但不能在三星上正常工作。
所以基本上。我有蜂窝网络,但 SyncAdapter 没有意识到这一点(在三星设备上)并且不会触发onPerformSync. 无论如何要让 SyncAdapter 意识到这一点?
android android-contentresolver android-syncadapter kotlin networkmanager
我有一个用于我的数据库的同步适配器,在应用程序使用的某些点,它需要立即同步数据库.我想触发同步适配器,就好像它的同步时间弹出一样,然后重新建立同步时间(即从此'同步现在'事件开始4小时).
我正在尝试将自定义ContentProvider显示在数据和同步下,并且我遇到了一些问题.也就是说,它没有出现.
具体内容:
我的AndroidManifest.xml有提供者和服务:
<provider android:name="BooksProvider"
android:label="ClientName Books"
android:authorities="com.clientname.reader.books"
android:enabled="true"
android:exported="true"
android:syncable="true">
<grant-uri-permission android:pathPattern=".*" />
</provider>
<service android:name=".sync.SyncService"
android:exported="true" android:process=":sync">
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data android:name="android.content.SyncAdapater"
android:resource="@xml/syncadapter" />
</service>
Run Code Online (Sandbox Code Playgroud)
res/xml/syncadapter.xml具有以下内容:
<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.clientname.reader.books"
android:accountType="com.google"
android:supportsUploading="true"
android:userVisible="true"
/>
Run Code Online (Sandbox Code Playgroud)
为了安全起见,我甚至在onCreate上打了以下电话:
AccountManager accountManager = AccountManager.get(getApplicationContext());
Account[] accounts = accountManager.getAccountsByType("com.google");
for(Account account : accounts){
Log.d(TAG, "Account: " + account.name);
ContentResolver.setIsSyncable(account, Reader.AUTHORITY, 1);
}
Run Code Online (Sandbox Code Playgroud)
当我加载Activity时,我从ContentResolver.setIsSyncable获取adb日志,说该帐户已经设置为可同步,因此该方法没有做任何事情.
但是,提供商拒绝显示在"设置">"帐户和同步">"数据和同步"中.有什么想法吗?任何人都知道如何确定该部分中出现的内容?
[edit]更多信息:
花了几个小时调试后,我遇到了这个错误:
04-11 10:46:02.370: DEBUG/SyncManager(105): can't find a sync adapter for SyncAdapterType Key {name=com.clientname.reader.books, …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个只需单击即可同步我的邮件和日历的应用程序.在浏览了这个论坛之后,我发现了一些很好的提示,并编写了一个简短的测试应用程序,它使用我的第一个谷歌帐户并开始同步.
代码工作到目前为止,但目前只有联系人同步!
AccountManager am = AccountManager.get(this);
Account[] acc = am.getAccountsByType("com.google");
Account account = null;
if (acc.length > 0) {
account = acc[0];
Bundle extras = new Bundle();
extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
ContentResolver.requestSync(account, ContactsContract.AUTHORITY,
extras);
}
Run Code Online (Sandbox Code Playgroud)
方法requestSync将"权限"作为参数,现在我使用"ContactsContract.AUTHORITY",我猜这只是同步我的联系人的原因.我现在的问题是,是否有人知道我必须使用哪个权限字符串才能同步我的邮件和日历?如果"null"用作权限,则所有三个(cal,contacts和mail)都会同步
public static void requestSync (Account account, String authority, Bundle extras)
Run Code Online (Sandbox Code Playgroud)
提前致谢!!
我的应用程序使用SyncAdapter模式,使用AccountManager和保存用户凭据,以及ContentProvider在数据库中存储数据.
当account被删除我可以删除使用方法的分贝在解释这个问题.通过执行以下操作删除数据库:
boolean deleted = mContext.deleteDatabase(DatabaseHelper.DATABASE_NAME);
Run Code Online (Sandbox Code Playgroud)
这工作正常,但当我再次登录时,一切仍然存在.感觉就像ContentProvider不知道数据库已被删除.
在这个答案中,inazaruk说:
您需要确保已经杀死了托管使用该特定数据库文件的ContentProvider的进程.而且只是删除它.
杀死进程以清除数据库感觉不对.
还有更好的事吗?