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
- Evitar el reemplazo del método en tiempo de ejecución en Java
- Android: diseño predeterminado para listitem que contiene el título y el subtítulo
- Android GoogleAPIClient - NoClassDefFoundError: com / google / android / gms / interno / zzsa
- Diferencia entre OpenCV y OpenCL
- Problema del tutorial de Android First App
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.
- ¿Cómo obtener el enlace directo de video remoto de url incrustado dentro de una url en Android usando JSoup?
- No encontró la clase "com.google.firebase.provider.FirebaseInitProvider"
- No se encontró ninguna implementación para Native UnsatisfiedLinkError Exception Android JNI
- Android.os.NetworkOnMainThreadException en AsyncTask
- Compara las fechas con Parse.com
- libgdx ¿por qué la cámara no sigue el personaje?
- Android Parcel.obtain () devuelve null?
- Las pestañas de menú no responden
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.