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