[英]SyncAdapter process killed when app process is terminated
从应用程序切换器列表中刷出应用程序时,为什么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;
}
}
从文档:
框架可以随时取消同步。 例如,非用户启动且持续时间超过30分钟的同步将被视为超时并取消。 类似地,框架将尝试通过在一分钟内监视其网络活动来确定适配器是否正在取得进展。 如果此窗口上的网络流量接近零,则同步将被取消。 您还可以通过
cancelSync(Account, String)
或cancelSync(SyncRequest)
请求取消同步。通过在同步线程上发出
interrupt()
来取消同步。 您在onPerformSync(Account, Bundle, String, ContentProviderClient, SyncResult)
必须检查interrupted()
,或者您必须覆盖onSyncCanceled(Thread)
/onSyncCanceled()
(取决于您的适配器是否支持同步多个帐户)在平行下)。 如果您的适配器不遵守框架发出的取消,那么您将面临应用程序整个进程被终止的风险。
您是否确保遵守SyncAdapter框架的规则?
此外,很高兴看到您的一些代码深入了解框架取消同步的原因...
onPerformSync()在单独的线程上工作。 因此,您不需要创建任何执行程序变量来实现后台工作。
我有同样的问题 - 我的适配器一直在onPerformSync()方法中使用执行器,执行操作(现在 - 另一个线程)。 这是一个原因 - 如果系统在它的线程中没有在onPerformSync()方法中看到任何作业(因为你创建了在另一个线程中执行动作的执行器) - 将调用onSyncCanceled()方法 - 它只是一个时间问题。
短时间操作将完成,但是长时间(10分钟)将由onSyncCanceled()终止。
您可以覆盖适配器中的onSyncCanceled() - 但您应该了解真正的问题并避免它。
这是项目示例https://github.com/Udinic/SyncAdapter 。 在onPerformSync()方法中执行客户端 - 服务器实现并没有问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.