HTTP-запрос каждые X секунд с использованием TimerTask

Я хочу отправлять запрос на сервер каждые X секунд и получать результаты. Без использования таймера все работает нормально, но если я использую timer.scheduleAtFixedRate, я получаю исключение:

"Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare()"

Как я могу избавиться от этого? Спасибо!

public class MainMap extends ActionBarActivity implements LocationListener , View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        int initialDelay = 1000;
        int period = 5000; 
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {

            public void run() {
                //request every 5 seconds
                setPosition();
            }
        };
        timer.scheduleAtFixedRate(task, initialDelay, period);
    }

    public void setPosition() {
        getCurrentLocation();

        ArrayList<JSONObject> dataDelete = new ArrayList<>();
        Map<String,String> mUserDelete = new HashMap<>();

        if (isOnline) {
            mUserDelete.put("available", String.valueOf(1));
        } else {
            mUserDelete.put("available", String.valueOf(0));
        }

        mUserDelete.put("id",user.getId());
        mUserDelete.put("longitude", String.valueOf(longitude));
        mUserDelete.put("latitude", String.valueOf(latitude));
        dataDelete.add(new JSONObject(mUserDelete));
        JSONArray jsonArrayDelete = new JSONArray();
        jsonArrayDelete.put(dataDelete);
        final JSONObject jsonObjectDelete = new JSONObject();

        try {
            jsonObjectDelete.put("request", jsonArrayDelete);

            new AsyncServerRequest().execute(jsonObjectDelete);

        } catch (JSONException e) {
            Log.d(Constants.tag, "JSONException: " + e.getMessage());
        }
    }

    public void getCurrentLocation() {
        lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);

        longitude = location.getLongitude();
        latitude = location.getLatitude();

    }


    public class AsyncServerRequest extends AsyncTask<JSONObject, Integer, Long> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(Long aLong) {
            super.onPostExecute(aLong);
        }

        @Override
        protected Long doInBackground(final JSONObject... jsonObjects) {
            final HttpRequest request = new HttpRequest(uriStatus, jsonObjects[0]);
            request.makeHttpRequest();
            return null;
        }
    }
}

person Denis    schedule 05.07.2015    source источник


Ответы (1)


проблема в этой строке кода

new AsyncServerRequest().execute(jsonObjectDelete);

вы не можете и не должны запускать AsyncTask из фонового потока, но всегда из потока пользовательского интерфейса. И вам, вероятно, не нужен AsyncTask, так как TimerTask уже работает в фоновом потоке.

person Blackbelt    schedule 05.07.2015