SyncAdapter- onPerformSync no tiene acceso a Internet

Tengo una clase de SyncAdapter que conecta con un corredor de MQTT y publico la carga útil para que el servidor reciba la carga útil. Sin embargo, parece que aunque se invoca el método onPerformSync() , el acceso a Internet no existe. Pensé que usar SyncAdapter garantiza el acceso a Internet?

Aquí está la clase SyncAdapter

 public class SyncAdapter extends AbstractThreadedSyncAdapter { private static final String TAG = SyncAdapter.class.getSimpleName(); private MqttHelper mqttHelper; public SyncAdapter(Context context, boolean autoInitialize) { super(context, autoInitialize); mqttHelper = new MqttHelper(getContext()); } public SyncAdapter(Context context, boolean autoInitialize, boolean allowParallelSyncs) { super(context, autoInitialize, allowParallelSyncs); } private boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); } @Override public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { Log.wtf(TAG, "onPerformSync: "); Log.wtf(TAG, "SYNC_EXTRAS_MANUAL: " + extras.getBoolean(ContentResolver.SYNC_EXTRAS_MANUAL)); Log.wtf(TAG, "SYNC_EXTRAS_EXPEDITED: " + extras.getBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED)); Log.wtf(TAG, "internte: " + isNetworkAvailable()); mqttHelper.connect(new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { Log.wtf(TAG, "onSuccess: "); mqttHelper.pub("hello/android", "Finally working via sync adapter praise the lord!!!!"); // TODO: Get Checkpoints from Realm // TODO: publish at once // TODO: Disconnect mqttHelper.disconnect(new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { Log.wtf(TAG, "onSuccess: disconnect"); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Log.wtf(TAG, "onFailure: disocnnect"); } }); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Log.wtf(TAG, "onFailure: ", exception); } }); } @Override public void onSyncCanceled() { super.onSyncCanceled(); Log.wtf(TAG, "sync canceled"); } } 

Y también un fragmento de mi manifiesto de Android perteneciente a MqttService y SyncAdapter:

 <application ... <receiver android:name=".LocationPollingReceiver" /> <service android:name="org.eclipse.paho.android.service.MqttService" android:process=":sync"/> <service android:name=".LocationPollingService" android:exported="false"/> <service android:name=".sync.AuthenticatorService"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator"/> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator" /> </service> <provider android:name=".sync.StubProvider" android:authorities="proj.com.fyp.provider" android:exported="false" android:syncable="true"/> <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.SyncAdapter" android:resource="@xml/syncadapter" /> </service> </application> 

¿Tiene esto algo que ver con la invocación de la sincronización manualmente? Como lo que hice abajo?

 Account mAccount = MainActivity.CreateSyncAccount(context); Bundle settingsBundle = new Bundle(); settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); //settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_FORCE, true); ContentResolver.requestSync(mAccount, AUTHORITY, settingsBundle); 

Incluso la sincronización a través de la Settings->Account->Sync now produjo el mismo resultado.

Déjeme explicarle algo.

OnPerformSync () es una devolución de llamada, que no depende de su control sobre cómo / cuando se llama? Estos tipos de devoluciones de llamada son generalmente tareas asíncronas, que pueden ser activadas desde objetos externos (pueden ser remotos) en cualquier momento. Por eso generalmente ponemos estos tipos de devoluciones de llamada en nuestro MainThread (hilo de interfaz de usuario) porque, MainThread no se puede eliminar en toda la aplicación. [Nota: Si ha ejecutado un servicio en el proceso diferente, también puede ejecutar onPerformSync () de ese servicio]. Mi intención de decir esto es para asegurarse de que a lo largo de la aplicación sigue funcionando, hay un cambio de estos callbacks se puede ejecutar en cualquier momento.

Realmente no veo ningún uso del método onNetworkAvailable () aquí. Utilice este onNetworkAvailable () si desea realizar algunas operaciones de red desde su lado.

  • Botón Inicio de la barra de acciones no funcional con PreferredScreen anidado
  • Administrador de alarmas de Android
  • Cómo definir negrita en un selector de Android?
  • Android: capitalize no funciona
  • Diferencia entre close () y disconnect () en Android Bluetooth API?
  • Cómo obtener getIntent () para devolver null después de Actividad llamada con un conjunto de intenciones
  • Añadir scroll en tabhost en android
  • Imagen "Zoom In / Out" en el botón Haga clic en Android?
  • Android - forma simple de entrada de usuario web-view para back-end java con jQuery Mobile
  • No se puede actualizar la vista de lista de android en onPostExecute
  • Android permiso de creación de base de datos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.