0

我试过AsyncTask了,线程和处理程序,但我不明白。

该方法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);
4

1 回答 1

1

您的问题是 onCancelled 仅在doInBackground 返回后调用。因此,您需要在 readXML 操作中检查 isCancelled。请参阅下面的文档摘录(来自http://developer.android.com/reference/android/os/AsyncTask.html)...

可以通过调用 cancel(boolean) 随时取消任务。调用此方法将导致对 isCancelled() 的后续调用返回 true。调用此方法后,将在 doInBackground(Object[]) 返回后调用 onCancelled(Object),而不是 onPostExecute(Object)。为了确保尽快取消任务,如果可能(例如在循环内),您应该始终从 doInBackground(Object[]) 定期检查 isCancelled() 的返回值。

于 2011-07-10T14:30:31.357 回答