Я пытаюсь сделать правильную синхронизацию фоновых данных.Проблема, при которой иногда запросы отправляются на сервер, иногда зависают и долго не отвечают, даже когда у меня настроен тайм-аут HTTP.
Я зарегистрировал службу в манифесте как:
<service
android:name=".service.JobSchedulerService"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
Служба:
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.support.annotation.Nullable;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import java.util.Timer;
import java.util.TimerTask;
import cz.msebera.android.httpclient.Header;
import cz.msebera.android.httpclient.message.BasicHeader;
public class JobSchedulerService extends Service {
public class LocalBinder extends Binder {
JobSchedulerService getService() {
return JobSchedulerService.this;
}
}
private final IBinder mBinder = new LocalBinder();
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
timer.cancel();
return true;
}
private static Timer timer;
public AsyncHttpClient getHttpClient() {
//in real this method extracted as a singleton in extra class
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
asyncHttpClient.setURLEncodingEnabled(true);
asyncHttpClient.setTimeout(5000);
asyncHttpClient.setConnectTimeout(5000);
asyncHttpClient.setResponseTimeout(5000);
return asyncHttpClient;
}
@Override
public void onCreate() {
timer = new Timer();
final Handler mHandler = new Handler(Looper.getMainLooper());
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
mHandler.post(new Runnable() {
public void run() {
startSynchronisation();
}
});
}
}, 0, 15000);
}
private void startSynchronisation() {
AsyncHttpResponseHandler responseHandler = new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
//some parsing
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
//some messages
}
};
String url = "http://some_url.com";
Header[] headers = {
new BasicHeader("Accept", "application/json"),
};
getHttpClient().get(JobSchedulerService.this, url, headers, null, responseHandler);
}
}
Когда я отлаживаю этот код, запрос данных выполняется без каких-либо исключений и ошибок, но никогда не возвращает значение, даже не получая TimeoutException.
Кто-то знает, что я пропускаю?Некоторые свойства или дополнительные звонки?
Или, возможно, кто-то может порекомендовать правильный способ реализации синхронизации данных в фоновом режиме?В лучшем случае неудержим, даже когда приложение закрыто.