我创建了一个类似字典应用程序的应用程序。当用户键入Edittext时,我调用AsyncTask来计算并将结果更新到屏幕上(我将UI更新代码放在onPostExecute()方法中)。然而,当您键入的速度有点快时,eddittext就会变得没有响应(有点延迟)。我认为出现这个问题是因为许多AsyncTasks正在运行(每个AsynTask都有一个输入字母)。所以,我想在调用新任务之前,我需要停止第一个任务。我说得对吗?在这种情况下我该怎么办?
您不需要在异步任务中实现filter方法。当第一个字母写在editbox中时,我对数据调用filter方法,并将结果保存在临时数组中,然后当另一个字母写完后,我对技术上比原始数据信息更少的临时数据调用filter法。通过这样做,数据集的尺寸会随着您在编辑框中的键入而减小。此外,您可以使用此方法存储以前的数据集,因此当您按退格键时,您不必再次调用filter方法,只需转到以前保存的临时数据集即可。对我来说,它工作得很好,我不必使用异步任务,因为它是高效的
我建议您使用另一种方法:只使用一个线程。搜索线程应该等待搜索数据>执行搜索>并休眠,直到有新数据。例如:
private static class SearchThread extends Thread{
private Object monitor = new Object();
private String value;
public void search(String value){
this.value = value;
synchronized (monitor){monitor.notify();}
}
@Override
public void run() {
while(true){
try {System.out.println("Wait for search data."); synchronized (monitor){monitor.wait(); }
} catch (InterruptedException e) {e.printStackTrace();}
System.out.println("Searching for " + value);
}
}
}