0

我有一个应用程序,它使用计时器每 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 分钟。

4

1 回答 1

1

如果您的计时器每 0.5 秒滴答一次并且 http 请求需要 1 秒,那么一段时间后,您将有数十个 http 请求在队列中等待并使用内存。

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

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

编辑:
您可以做的是在每次上一个 http 请求完成时启动计时器计数。您可以使用带有无限循环(带有一些退出条件)的工作线程(而不是计时器)来执行此操作,该循环发出请求,并在完成时休眠 0.5 秒。这样您就可以确保您在任何时候都只有一个 http 请求。

于 2014-02-28T22:14:49.300 回答