gpt4 book ai didi

java - Android:重新启动搜索线程

转载 作者:行者123 更新时间:2023-12-01 04:37:33 25 4
gpt4 key购买 nike

我有一个简单的 EditText,其中包含 TextChangedListenerListView

onTextChanged 方法将调用以下 restartSearch 方法,因此在输入 EditText 时应重新启动当前搜索线程。

search 方法只是将匹配的项添加到 ListView 中。

searchThread 仍处于 Activity 状态时,我想取消并重新启动搜索,以便 UI 在键入时不会卡住,并且不会花费太长时间。

Thread searchThread;

private void restartSearch(CharSequence cs){
query = cs;
if(searchThread != null && searchThread.isAlive()){
searchThread.interrupt();
}
searchThread = new Thread(new Runnable() {
public void run() {
if(!lastSearch.equals(query))
search(query);
}
});
searchThread.start();
}

我调用它的方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

EditText etSearch = ((EditText) findViewById(R.id.etSearch));

//...

etSearch.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
restartSearch(s);
}

//...
});
}

还有另一个(我也从那里更新了 UI):

final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==1){
//...
adapter.notifyDataSetChanged();
restartSearch(lastSearch);
}
else if(msg.what==2)
adapter.notifyDataSetChanged();
super.handleMessage(msg);
}
};

消息msgsearch方法发送以更新UI:

private void search(CharSequence s){
searchResults.clear();
if(!s.toString().equals("")){
for(int i=0; i<vocsCount; i++){
try{
getResult(i, 0, 2,s);
getResult(i, 1, 1,s);
}catch(Exception ex){}
}
Collections.sort(searchResults);
}
Message msg = handler.obtainMessage();
msg.what = 2;
handler.sendMessage(msg);

lastSearch = s;
}

因此,当它每次创建一个新的 Runnable 时,它们看起来好像都是并行运行的,因为所有搜索项都会多次添加到 ListView 中。

如何避免这种情况?

最佳答案

我不认为你真的需要在这里创建一个线程。因为 GUI 正在监听不同的线程,并且当它对发生在不同线程中的“onTextChanged”进行回调时。如果这不是两个不同的线程,那么您将无法在搜索时保持 GUI 响应。

关于java - Android:重新启动搜索线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17124991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com