我有一个应用程序,它使用计时器每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分钟。
如果您的计时器每0.5秒一次,http请求需要1秒,那么过一段时间后,您会有几十个http请求在队列中等待并使用内存。
此外,您的逻辑可能过于复杂。计时器有自己的线程,在该线程中,您要求在UI线程建AsyncTask???最后,所有AsyncTask都可能并发运行,并且您有许多HTTP并发请求。
为什么不在计时器线程或中创建异步任务中的HTTP请求呢?
编辑:
您可以做的是在每次上一个http请求完成时启动计时器计数。您可以使用一个工作线程(而不是计时器)来完成此操作,该线程具有发出请求的无限循环(具有一些退出条件),当它完成时,它将休眠0.5秒。通过这种方式,您可以确保在任何时候都只有一个http请求。