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;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android Activity에서 YouTube 동영상을 전체 화면으로 표시Android 개발이었던 한 가지 과제는 다음과 같습니다. 하나의 활동에 WebView가 있습니다. 그 WebView의 내용은 YouTube 동영상을 임베드한 Iframe입니다. 당연히 WebView 화면의 재생 버...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.