取消长时间的操作(Asynctask,thread…?)



我尝试了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);

您的问题是onCancelled仅在 doInBackground返回后调用。因此需要在readXML操作中检查isCancelled。

可以通过调用cancel(boolean)随时取消任务。调用此方法将导致对isCancelled()的后续调用返回true。调用这个之后方法,而不是onCancelled(Object)的onPostExecute(Object)将被执行doInBackground(Object[])的回报。以确保一个任务是尽快取消,你应该总是检查返回值吗isCancelled()周期性地从doInBackground(Object[]),如果可能的话(例如在循环中)

最新更新