async task 주의사항

1577 단어
  • AsyncTask는 스레드 탱크를 사용하는데 스레드 탱크를 사용하지 않으면 다시 풀에 넣을 수 있다.새로운 AsyncTask가 있으면 이미 있는 라인을 꺼내서 실행합니다. 이것이 바로 여러 AsyncTask가 있는 이유입니다.
  • AsyncTask 대상은 중복 사용할 수 없습니다. 즉, AsyncTask 대상은 excute() 한 번만 사용할 수 있습니다. 그렇지 않으면'java.lang.IllegalStateException: Cannot execute task: the task is already running'
  • 을 이상하게 던질 수 있습니다.
  • doInBackground ()에서 isCancelled () 의 반환 값을 검사합니다. 비동기적인 작업을 취소할 수 있다면.cancel () 은 AsyncTask 대상에 표지 위치를 설정한 것일 뿐입니다. cancel () 을 호출한 후 발생하는 일은 다음과 같습니다. AsyncTask 대상의 표지 위치가 바뀌었고, DoInBackground () 가 실행된 후에 onPostExecute () 는 리셋되지 않으며, DoInBackground () 와 onProgressUpdate () 는 DoInBackground () 가 끝날 때까지 계속 실행됩니다.따라서 DoInBackground () 에서 isCancellled () 의 반환 값을 끊임없이 검사하고,true로 되돌아갈 때, 특히 순환이 있을 때 실행을 중지해야 한다.위의 예와 같이 만약에 데이터를 읽는 isCancelled() 검사를 없애면 그림은 다운로드되고 진도도 계속 갈 것이다. 단지 마지막 그림은 UI에 올리지 않을 것이다(onPostExecute()는 리셋되지 않았기 때문이다)!
  • async task 모델 취소

  • public class Task extends AsyncTask{

    @Override
    protected Void doInBackground(Void... path) {
    // Task ,
    if(isCancelled()) return null;
    }

    @Override
    public void onProgressUpdate(File... files) {
    // Task ,

    if(isCancelled()) return;
    .........
    }
    }

    UI :

    // Task

    private PhotoTask task;

    // 1,
    task = new PhotoTask();
    task.execute(path);

    // 2,

    if (task != null && task.getStatus() == AsyncTask.Status.RUNNING) {
    task.cancel(true); // Task ,
    }

    }
    }

    좋은 웹페이지 즐겨찾기