André, resumindo em uma frase o SyncAdapter: Não confie nele. É a API oficial pra isso sim, deve ser usado sem sombra de dúvida sim, mas é preciso aprender o conceito dele antes de sair usando. Digo isso por experiência. O SyncAdaper foi lançado com 2 objetivos: facilitar o assunto sincronização pros desenvolvedores e preservar o Android (bateria, back-off). O objetivo principal dele é preservar bateria, logo, por padrão, ele é assíncrono, (quase) nunca roda imediatamente pois é oportunista.
Se vc enviar vários pedidos de sincronização em sequência, ou tiver o modo automático e manual habilitados o SyncManager, que é o serviço gerenciador de sincronização vai "agrupar" as requisições e entregá-las quando for oportuno. Por exemplo, se vc envia pedidos quando o aparelho está sem conexão (3G, wifi) ele espera até quando essas conexões forem ativadas para despachar os pedidos.
Tive um problema parecido: basicamente eu queria que a sincronização fosse oportunista e rodasse em segundo plano pra 90% dos casos, porém em 10% eu queria que fosse imediato (manual). A forma que encontrei foi implementar o SyncAdapter todo (ContentProvider, Service, XML e tudo o mais) e criar um segundo Service, um bound service, que também fazia a mesma coisa que o Sync Service, mas nesse eu mandava a requisição explicitamente. Por exemplo:
Como pode ver, é um service simples (mais ou menos, rs) onde eu me conecto pra enviar as requisições direto para o SyncAdapter.
Só lembrando que o uso é muito específico, do contrario deixo o gerenciamento do Android fazer o que sabe de melhor.
Espero que ajude.
-- Se vc enviar vários pedidos de sincronização em sequência, ou tiver o modo automático e manual habilitados o SyncManager, que é o serviço gerenciador de sincronização vai "agrupar" as requisições e entregá-las quando for oportuno. Por exemplo, se vc envia pedidos quando o aparelho está sem conexão (3G, wifi) ele espera até quando essas conexões forem ativadas para despachar os pedidos.
Tive um problema parecido: basicamente eu queria que a sincronização fosse oportunista e rodasse em segundo plano pra 90% dos casos, porém em 10% eu queria que fosse imediato (manual). A forma que encontrei foi implementar o SyncAdapter todo (ContentProvider, Service, XML e tudo o mais) e criar um segundo Service, um bound service, que também fazia a mesma coisa que o Sync Service, mas nesse eu mandava a requisição explicitamente. Por exemplo:
public final class BoundSyncService extends Service {
private static final String TAG = BoundSyncService.class.getSimpleName();
private static final Object sLock = new Object();
private static SyncAdapter sSyncAdapter;
private LocalBinder mBinder;
private Account mAccount;
private ContentProviderClient mContentProviderClient;
public BoundSyncService() {
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onCreate() {
super.onCreate();
synchronized (sLock) {
if (sSyncAdapter == null) sSyncAdapter = new SyncAdapter(this, true);
mBinder = new LocalBinder();
mAccount = AuthenticatorService.createSyncAccount(this);
mContentProviderClient = getContentResolver().acquireContentProviderClient(AUTHORITY_URI);
}
}
@Override
public void onDestroy() {
mContentProviderClient.release();
super.onDestroy();
}
public SyncResult performSync(Bundle extras) {
SyncResult syncResult = new SyncResult();
try {
extras.putBoolean("bound", true);
sSyncAdapter.onPerformSync(mAccount, extras, AUTHORITY, mContentProviderClient, syncResult);
} catch (ObjectNotFoundException e) {
syncResult.databaseError = false;
syncResult.stats.numIoExceptions++;
} catch (Exception e) {
Log.e(TAG, "Unhandled exception from #onPerformSync()", e);
}
return syncResult;
}
public class LocalBinder extends Binder {
public BoundSyncService getService() {
return BoundSyncService.this;
}
}
}
Como pode ver, é um service simples (mais ou menos, rs) onde eu me conecto pra enviar as requisições direto para o SyncAdapter.
Só lembrando que o uso é muito específico, do contrario deixo o gerenciamento do Android fazer o que sabe de melhor.
Espero que ajude.
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.






0 comentários:
Postar um comentário