Запрос Http каждые x секунд с использованием Timer начинает замедлять пользовательский интерфейс через некоторое время

У меня есть приложение, которое отправляет HTTP-запрос каждые 0,5 секунды с помощью таймера. У меня это есть в asyncTask, и я читаю данные из вывода после того, как это делается из onPostExecute. Через некоторое время мое приложение начинает отставать, а пользовательский интерфейс замедляется. Знаете ли вы, почему это происходит и как это сделать правильно?

public class Komunikace extends AsyncTask<String, Void, String> {
     public static KomunikaceInterface delegate=null;
    //ProgressDialog progress;
String response = "";
String url = "";
DefaultHttpClient client;
HttpGet httpGet;
HttpResponse execute;
InputStream content;
BufferedReader buffer;
String s = "";

    protected String doInBackground(String... params)
    {
        url = params[0];

        client = new DefaultHttpClient();
        httpGet  = new HttpGet(url);
            try {
                execute = client.execute(httpGet);
                content = execute.getEntity().getContent();

                buffer = new BufferedReader(new InputStreamReader(content));

                while ((s = buffer.readLine()) != null) {
                    response += s + "\n";
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        client.getConnectionManager().shutdown();
        return response;

    }

    protected void onPreExecute()
    {
        super.onPreExecute();
    }

    protected void onPostExecute(String result)
    {
        delegate.processFinish(result); // prijata tabulka
    }
    }

Это мой класс asyncTask. Тогда я называю это так:

    tajmr = new Timer();
    tajmr.schedule(new TimerTask() {
        @Override
        public void run() {
            CallWebService();
        }

    }, 0, 100);

И затем это для вызова:

    private void CallWebService()
{
    this.runOnUiThread(fetchData);
}
private Runnable fetchData = new Runnable() {
    public void run() {
        try
        {
            updateURL =url;
            Komunikace komunikace= new Komunikace();
            komunikace.execute(updateURL);
        }
        catch (Exception e)
        {

        }
    }
};

Похоже, он где-то зацикливается и через некоторое время замедляется. Это время занимает, например, 1 минуту.


person Simen    schedule 28.02.2014    source источник


Ответы (1)


Если ваш таймер тикает каждые 0,5 секунды, а http-запрос занимает 1 секунду, через некоторое время у вас появятся десятки http-запросов, ожидающих в очереди и использующих память.

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

Почему бы вам просто не сделать HTTP-запрос в потоке таймера или AsyncTask?

РЕДАКТИРОВАТЬ:
Что вы можете сделать, так это запустить отсчет таймера каждый раз, когда предыдущий HTTP-запрос завершен. Вы можете сделать это с помощью рабочего потока (вместо таймера) с бесконечным циклом (с некоторым условием выхода), который выполняет запрос, а когда он завершается, он спит на 0,5 секунды. Таким образом вы гарантируете, что у вас всегда будет один HTTP-запрос в любое время.

person Merlevede    schedule 28.02.2014
comment
Есть два мнения.. во-первых: я думаю так же об укладке http-запросов по истечении времени.. поэтому я делаю переменные ints и считаю начало и конец запросов.. счет всегда был одинаковым :( и во-вторых: я поднимаю большой код .. когда я пытаюсь сделать это в потоке таймера, это было хуже, чем сейчас - person Simen; 01.03.2014
comment
Ох ! выглядит хорошо, спасибо .. завтра я попробую, чем дам вам знать и отмечу хороший ответ :) - person Simen; 01.03.2014
comment
Хорошо, я пытаюсь сделать цикл с 2 раза для CallWebServise, а затем дождаться завершения процесса .. я понял, что у меня есть 2 проблемы, одна из них, а вторая - датчик .. но, к счастью, теперь эта проблема исчезла, так что спасибо !! :) - person Simen; 01.03.2014