【发布时间】:2016-01-27 16:05:41
【问题描述】:
为什么从应用切换器列表中滑动应用时 SyncAdapter 进程 (:sync) 会被终止?我认为这里的全部目的是让它们解耦。
编辑:
以下是使用的代码。 mUploadTask 是一个 AsyncTask 即时执行,它从 sqlite 表中读取信息(使用 getContext().getContentResolver())并将相关数据上传到后端(使用 HttpPost)。非常直接。
另外,我只实现了一个onSyncCanceled(),因为我的SyncAdapter 不支持并行同步多个帐户。
public class SyncAdapter extends AbstractThreadedSyncAdapter implements UploadTaskListener {
private static final String TAG = SyncAdapter.class.getSimpleName();
private static volatile UploadTask mUploadTask;
/**
* Set up the sync adapter
*/
public SyncAdapter(Context context, boolean autoInitialize) {
super(context, autoInitialize);
}
/**
* Set up the sync adapter. This form of the
* constructor maintains compatibility with Android 3.0
* and later platform versions
*/
public SyncAdapter(
Context context,
boolean autoInitialize,
boolean allowParallelSyncs) {
super(context, autoInitialize, allowParallelSyncs);
}
@Override
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
MHLog.logI(TAG, "onPerformSync");
ContentResolver.setSyncAutomatically(account, authority, true);
if (mUploadTask == null) {
synchronized (SyncAdapter.class) {
if (mUploadTask == null) {
mUploadTask = new UploadTask(getContext(), this).executeOnSettingsExecutor();
MHLog.logI(TAG, "onPerformSync - running");
}
}
}
}
@Override
public void onSyncCanceled() {
MHLog.logI(TAG, "onSyncCanceled");
if(mUploadTask != null){
mUploadTask.cancel(true);
mUploadTask = null;
}
}
【问题讨论】:
-
你的 UploadTask 是什么,这只是一个 AsyncTask 吗?
-
@AsafK 首先在哪里创建帐户等?查看文档示例。其次,如果onPerformSync本身运行在worker线程中,为什么还需要异步任务?
标签: android android-syncadapter