Libgdx 학습 노트: 자신 이 쓴 비동기 로 딩 공유

수요 부터 말하자면:
xml, json 파일 등 시간 이 걸 리 는 작업 을 분석 합 니 다. 스 레 드 를 그리 거나 초기 화 하면 화면 이 멈 춰 불쾌 해 보일 수 있 습 니 다. 이 럴 때 다시 불 러 올 수 있 을 까 생각 합 니 다.
Libgdx 의 AssetManager 를 보면 AsyncExecutor, AsyncTask, AsyncResult 와 관련 된 비동기 스 레 드 풀 이 사용 되 어 있 습 니 다.
간단 한 소개:
【AsyncExecutor】
독립 된 스 레 드 에서 비동기 로 AsyncTask 인 스 턴 스 를 실행 합 니 다.사용 할 필요 가 없 을 때 dispose () 를 호출 하여 방출 합 니 다.
내부 소스 코드 를 보면 자바 의 스 레 드 풀 Executors. new Fixed ThreadPool 을 사용 하여 관리 합 니 다.
간단하게 AsyncTask 를 처리 하 는 용기 입 니 다.
[AsyncTask] 인터페이스 로 실제 상황 에 따라 자신의 Task 를 실현 할 수 있 습 니 다.
AsyncExecutor 에 작업 을 제출 하고 T 형식의 결 과 를 되 돌려 줍 니 다.
【AsyncResult】
 AsyncExecutor. submit (AsyncTask) 가 돌아 온 결과 입 니 다.
 isDone () 방법 은 작업 이 완료 되 었 는 지 여 부 를 대표 합 니 다.
=================================================================
상위 코드:
CHAsyncTask 추상 작업 클래스
CHAsyncManager 비동기 관리 센터 는 Game 에 넣 어 초기 화하 고 render () 에서 update () 방법 을 호출 하 는 것 이 좋 습 니 다.
비동기 작업 이 완료 되 었 는 지 순환 적 으로 검사 합 니 다.
간단하게 말 하면 우 리 는 케이크 가게 에 가서 케이크 를 주 문 했 습 니 다. 사장 님 께 서 당신 에 게 선하증권 을 주 셨 습 니 다. 그리고 요리사 에 게 케이크 를 만 들 라 고 했 습 니 다. 이때 샤 오 밍 에 게 30 분 마다 선하증권 을 들 고 케이크 가게 에 가서 확인 하 라 고 했 습 니 다. 케이크 가 다 되 었 습 니까?다 되면 가 져 와.
이 기간 동안 너 는 다른 일 을 할 수 있 으 니, 계속 기다 릴 필요 가 없다.
케이크 를 만들다 
인수증 = AsyncResult
샤 오 밍 = > Game 의 render ()
public abstract class CHAsyncTask implements AsyncTask<String> {
    private CHAsyncManager asyncManager;
    //     
    private AsyncResult<String> depsFuture = null;

    //   OK?
    volatile boolean asyncDone = false;

    public CHAsyncTask() {

    }

    public CHAsyncTask(CHAsyncManager manager) {
        asyncManager = manager;
    }

    @Override
    public String call() throws Exception {
        //     
        String result = doInBackground();
        asyncDone = true;
        return result;
    }

    /**    */
    public abstract void onPreExecute();

    /**        */
    public abstract void onPostExecute(String result);

    /**    */
    public abstract String doInBackground();

    // 
    public boolean update() {
        if (!asyncDone) {
        //      
            if (depsFuture == null) {
                //        ,    
                onPreExecute();
                depsFuture = asyncManager.getExecutor().submit(this);
            }
        } else {
            if (depsFuture.isDone()) {
            //            
                try {
                    onPostExecute(depsFuture.get());
                } catch (Exception e) {
                    throw new GdxRuntimeException("depsFuture.get() failed!!!!");
                }

            }
        }

        return asyncDone;
    }

    public void setAsyncManager(CHAsyncManager asyncManager) {
        this.asyncManager = asyncManager;
    }

    public CHAsyncManager getAsyncManager() {
        return asyncManager;
    }

    /**
     * 
     * <pre>
     *       
     * 
     * date: 2015-1-18
     * </pre>
     * @author 
     * @return
     */
    public boolean isDone() {
        return asyncDone;
    }
}
public class CHAsyncManager implements Disposable {
    //     
    private final Stack<CHAsyncTask> tasks = new Stack<CHAsyncTask>();

    private AsyncExecutor executor;

    public CHAsyncManager() {
        //           1。                    。
        executor = new AsyncExecutor(1);
    }

    public boolean update() {
        if (tasks.size() == 0)
            return true;

        return updateTask() && tasks.size() == 0;
    }

    private boolean updateTask() {
        //      
        CHAsyncTask task = tasks.peek();
        if (task.update()) {
            //      ,   
            tasks.pop();
            return true;
        }
        return false;
    }

    /**
    *      
    */
    public void loadTask(CHAsyncTask task) {
        if (task.getAsyncManager() == null) {
            task.setAsyncManager(this);
        }
        tasks.push(task);
    }

    @Override
    public void dispose() {
        executor.dispose();
    }

    public AsyncExecutor getExecutor() {
        return executor;
    }

}

좋은 웹페이지 즐겨찾기