SyncAdapter-onPerformSync не имеет доступа в Интернет

У меня есть класс SyncAdapter который соединяется с брокером MQTT и публикует полезную нагрузку для сервера для получения полезной нагрузки. Однако кажется, что даже при onPerformSync() метода onPerformSync() доступ в Интернет отсутствует. Я думал, что использование SyncAdapter гарантирует доступ в Интернет?

Вот класс 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"); } } 

А также фрагмент моего Android Manifest, относящийся к MqttService и 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> 

Имеет ли это какое-либо отношение к вызову синхронизации вручную? Как то, что я сделал ниже?

 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); 

Даже синхронизация через Settings->Account->Sync now дала тот же результат.

Solutions Collecting From Web of "SyncAdapter-onPerformSync не имеет доступа в Интернет"

Позвольте мне кое-что объяснить.

OnPerformSync () – это обратный вызов, который не зависит от того, как / когда он вызван? Эти типы обратных вызовов обычно являются Async Tasks, которые могут запускаться из внешних (могут быть удалены) объектов в любое время. Вот почему мы обычно помещаем эти типы обратных вызовов в наш MainThread (поток пользовательского интерфейса), потому что MainThread не может быть убит во всем приложении. [Примечание. Если вы выполнили службу в другом процессе, вы также можете запустить onPerformSync () из этой Службы]. Мое намерение сказать это, чтобы убедиться, что во всем приложении продолжает работать, происходит изменение этих обратных вызовов в любой момент.

Я действительно не вижу никакого использования метода onNetworkAvailable () здесь. Вы используете этот onNetworkAvailable (), если хотите выполнить некоторые сетевые операции с вашей стороны.