安全的方式来阻止一个线程 - Android

时间:2011-04-14 17:51:51

标签: android multithreading autocomplete

我正在尝试为我的应用程序的一部分实现自动建议功能。作为其中的一部分,当用户键入文本字段时,我会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) {

}

3 个答案:

答案 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

Android Loader - Dev Guide

答案 2 :(得分:0)