Android Отмена длительной работы (Asynctask, поток ...?) - PullRequest
0 голосов
/ 10 июля 2011

Я пытался AsyncTask, Thread и Handler, но я не понимаю.

Метод readXML() занимает около 1-2 минут, и мне нужен только способ отменить эту операцию.Все решения, которые я нашел, были для кратковременных операций (установка флага, проверка флага и остановка).

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

protected class InitTask extends AsyncTask<Context, Integer, String> {

    @Override
    protected String doInBackground( Context... params ){
        try{
            preparing = true;
            readXML();
            preparing = false;
        } catch( Exception e ){
            Log.i("test", e.getMessage() );
        }
        return "COMPLETE!";
    }

    @Override
    protected void onCancelled(){               
        super.onCancelled();
    }

}

// ....
_initTask = new InitTask();
_initTask.execute(this);

// ....
_initTask.cancel(true);

1 Ответ

1 голос
/ 10 июля 2011

Ваша проблема в том, что onCancelled вызывается только после возврата doInBackground.Поэтому вам нужно проверить isCancelled в вашей операции readXML.См. Выдержку из документов (из http://developer.android.com/reference/android/os/AsyncTask.html) ниже ...

Задача может быть отменена в любое время с помощью вызова cancel (логическое значение). Вызов этого метода вызовет последующие вызовы isCancelled), чтобы вернуть значение true. После вызова этого метода onCancelled (Object) вместо onPostExecute (Object) будет вызываться после возврата doInBackground (Object []). Чтобы убедиться, что задача отменена как можно быстрее, всегда следует проверятьПериодически возвращайте значение isCancelled () из doInBackground (Object []), если это возможно (например, внутри цикла.)

...