我正在尝试为我的应用程序的一部分实现自动建议功能。作为其中的一部分,当用户键入文本字段时,我会ping一个Web服务以获取结果,解析xml并使用返回结果列表更新列表视图。
这是我的程序的基本流程。我的问题是,如果我以正确的方式停止线程。调用thread.interrupt()是否足够?
init() {
// <snip>
searchTxt.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
FetchResults();
}});
}
private void FetchResults()
{
if(mCurrentNetworkThread != null)
{
mCurrentNetworkThread.interrupt();
mCurrentNetworkThread = null;
}
mCurrentNetworkThread = new Thread(
new Runnable() {
public void run() {
List<NameValuePair> paramTable = new ArrayList<NameValuePair>(1);
paramTable.add(new BasicNameValuePair("searchText", searchTxt.getText().toString()));
String methodName = "GetSearchResults";
NetworkAccessClass nac = new NetworkAccessClass(paramTable, IP_ADDR, methodName, 0, this);
nac.startRequest();
}
});
mCurrentNetworkThread.start();
}
@Override
public void requestSucceeded(String responseMessage, int callID) {
parseResponseFromNetwork(responseMessage);
}
@Override
public void requestFailed(String responseCode, int callID) {
}
答案 0 :(得分:3)
如果从Activity执行该代码,则很可能遇到并发问题,而不使用Handler从另一个线程修改GUI线程中的某些内容。简单来说,我建议使用AsyncTask。它解决了您在Android中遇到的任何问题。这些任务可以通过cancel()函数取消,并且就Android中的任何线程异常而言都是安全的。
[编辑]
请务必查看Jon关于使用Loaders的评论,这是我不知道的3.0功能。
答案 1 :(得分:2)
自Android 3.0起,AsyncTasks
将在很大程度上被Loaders
使用新的兼容性库,它们甚至可以用于Android 1.6。
这些链接可以帮助您:
android-3-0-what-are-the-advantages-of-using-loadermanager-instances-exactly
答案 2 :(得分:0)