Асинхронный HTTP-запрос на получение в фоновом режиме Android-службы (Фоновая синхронизация данных) - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь сделать правильную синхронизацию фоновых данных.Проблема, при которой иногда запросы отправляются на сервер, иногда зависают и долго не отвечают, даже когда у меня настроен тайм-аут 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.

Кто-то знает, что я пропускаю?Некоторые свойства или дополнительные звонки?

Или, возможно, кто-то может порекомендовать правильный способ реализации синхронизации данных в фоновом режиме?В лучшем случае неудержим, даже когда приложение закрыто.

...