Безопасный способ остановить поток - Android - PullRequest
3 голосов
/ 14 апреля 2011

Я пытаюсь реализовать функцию автоматического предложения, подобную функциональности, для части моего приложения.Как часть этого, когда пользователь вводит текстовое поле, я пингую веб-службу для результатов, анализирую 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 ]

3 голосов
/ 14 апреля 2011

Если этот код выполняется из Activity, вы, скорее всего, столкнетесь с проблемами одновременного изменения чего-либо в потоке GUI из другого потока без использования Handler .Простой способ обойти это, я рекомендую использовать AsyncTask .Это решает любые проблемы, которые вы будете иметь в Android.Эти задачи можно отменить с помощью функции cancel (), и она будет безопасна для любых исключений потоков в Android.

[Редактировать]

Убедитесь, что вы ознакомились с комментарием Джона ниже оиспользуя Loaders, функцию 3.0, о которой я не знал.

2 голосов
/ 14 апреля 2011

Начиная с Android 3.0, AsyncTasks будет в значительной степени заменен на Loaders

. Их даже можно использовать вплоть до Android 1.6 с новой библиотекой совместимости.

Эти ссылки должны помочь вамвместе:

android-3-0-что-то-преимущества-использования-loadermanager-instances-точно

Android Loader - DevРуководство

0 голосов
/ 14 апреля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...