使用Timer的每隔x秒的Http请求在while之后开始减慢UI

时间:2014-02-28 22:03:51

标签: android http timer slowdown

我有一个应用程序,它使用Timer每0.5秒发送一次HTTP请求。我在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分钟。

1 个答案:

答案 0 :(得分:1)

如果你的计时器每0.5秒计时一次,http请求需要1秒,过了一段时间你就会有数十个http请求在队列中等待并使用内存。

此外,您的逻辑可能过于复杂。 计时器有它自己的线程,在那个线程中你要求在 UI线程上做一些工作,那个工作包括创建一个AsyncTask ???最后,可能所有AsyncTask都可以并发运行,并且您有许多HTTP并发请求。

为什么不在定时器线程 AsyncTask中发出HTTP请求?

编辑:
您可以做的是每次上一次http请求完成时启动计时器计数。您可以使用具有无限循环(具有一些退出条件)的工作线程(而不是计时器)来执行此操作,该工作程序发出请求,并且当它完成时,它会休眠0.5秒。通过这种方式确保,您随时都可以拥有一个http请求。