SyncAdapter- onPerformSync hat keinen Internetzugang

Ich habe eine SyncAdapter Klasse, die eine Verbindung zu einem MQTT-Broker herstellt und die Payload für den Server veröffentlicht, um die Payload zu erhalten. Allerdings scheint es, dass, obwohl die onPerformSync() -Methode aufgerufen wird, der Internet-Zugang nicht da ist. Ich dachte mit SyncAdapter garantiert Internet-Zugang?

Hier ist die SyncAdapter-Klasse

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

Und auch ein Snippet von meinem Android Manifest im Zusammenhang mit dem MqttService und 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> 

Hat das etwas mit dem manuellen Aufrufen der Synchronisierung zu tun? Wie was ich unten gemacht habe?

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

Auch die Synchronisierung über die Settings->Account->Sync now das gleiche Ergebnis erzeugt.

  • Codeänderungen, die sich nicht in .apk widerspiegeln
  • Android Logcat: Wie kann ich eine Log-Nachricht mit einem TAB-Zeichen ausgeben?
  • So speichern Sie ausgewählte Elemente eines ExpandableListView in einer ArrayList
  • Transaktionen halten sich in Puffer (Google Analytics SDK für Android)
  • Ist es möglich, das Programm programmgesteuert auf Java, Android zu erstellen?
  • RxJava und Cached Daten
  • Android Wie man LinkedHashMap zwischen Aktivitäten passieren?
  • Erhöhung der Sichtbarkeit einer Ansicht auf Swipe mit Gesten in Android
  • One Solution collect form web for “SyncAdapter- onPerformSync hat keinen Internetzugang”

    Lass mich etwas erklären.

    OnPerformSync () ist ein Rückruf, der Ihrer Kontrolle nicht gerecht wird, wie und wann es angerufen wird? Diese Arten von Rückrufen sind in der Regel Async Tasks, die von externen (kann Remote-Objekte) jederzeit ausgelöst werden können. Deshalb haben wir diese Art von Rückrufen in unserem MainThread (UI Thread) in der Regel, weil MainThread nicht in der App getötet werden kann. [Anmerkung: Wenn Sie einen Dienst in dem anderen Prozess ausgeführt haben, dann können Sie auch aufPerformSync () von diesem Service aus laufen). Meine Absicht, dies zu sagen ist, um sicherzustellen, dass während der App läuft läuft, gibt es eine Änderung dieser Rückrufe können jederzeit ausgeführt werden.

    Ich sehe wirklich keinen Gebrauch von onNetworkAvailable () Methode hier. Sie verwenden diese onNetworkAvailable (), wenn Sie einige Netzwerkoperationen von Ihrer Seite aus machen möchten.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.