Tecnologia do Blogger.
RSS

[androidbrasil-dev] Re: SyncAdapter manual x automático

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:

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.

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

0 comentários:

Postar um comentário