AndEngine 分析之三-----AsyncTask,BaseActivity备忘
?
不用handler更细页面的另一种更新方式:
?
AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.
?
public abstract class BaseActivity extends Activity {/** * Performs a task in the background, showing a {@link ProgressDialog}, * while the {@link Callable} is being processed. * * @param <T> * @param pTitleResID * @param pMessageResID * @param pErrorMessageResID * @param pCallable * @param pCallback */protected <T> void doAsync(final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback) {this.doAsync(pTitleResID, pMessageResID, pCallable, pCallback, null);}/** * Performs a task in the background, showing a indeterminate {@link ProgressDialog}, * while the {@link Callable} is being processed. * * @param <T> * @param pTitleResID * @param pMessageResID * @param pErrorMessageResID * @param pCallable * @param pCallback * @param pExceptionCallback */protected <T> void doAsync(final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {new AsyncTask<Void, Void, T>() {private ProgressDialog mPD;private Exception mException = null;@Overridepublic void onPreExecute() {this.mPD = ProgressDialog.show(BaseActivity.this, BaseActivity.this.getString(pTitleResID), BaseActivity.this.getString(pMessageResID));super.onPreExecute();}@Overridepublic T doInBackground(final Void... params) {try {return pCallable.call();} catch (final Exception e) {this.mException = e;}return null;}@Overridepublic void onPostExecute(final T result) {try {this.mPD.dismiss();} catch (final Exception e) {Debug.e("Error", e);}if(this.isCancelled()) {this.mException = new CancelledException();}if(this.mException == null) {pCallback.onCallback(result);} else {if(pExceptionCallback == null) {Debug.e("Error", this.mException);} else {pExceptionCallback.onCallback(this.mException);}}super.onPostExecute(result);}}.execute((Void[]) null);}/** * Performs a task in the background, showing a {@link ProgressDialog} with an ProgressBar, * while the {@link AsyncCallable} is being processed. * * @param <T> * @param pTitleResID * @param pMessageResID * @param pErrorMessageResID * @param pAsyncCallable * @param pCallback */protected <T> void doProgressAsync(final int pTitleResID, final ProgressCallable<T> pCallable, final Callback<T> pCallback) {this.doProgressAsync(pTitleResID, pCallable, pCallback, null);}/** * Performs a task in the background, showing a {@link ProgressDialog} with a ProgressBar, * while the {@link AsyncCallable} is being processed. * * @param <T> * @param pTitleResID * @param pMessageResID * @param pErrorMessageResID * @param pAsyncCallable * @param pCallback * @param pExceptionCallback */protected <T> void doProgressAsync(final int pTitleResID, final ProgressCallable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {new AsyncTask<Void, Integer, T>() {private ProgressDialog mPD;private Exception mException = null;@Overridepublic void onPreExecute() {this.mPD = new ProgressDialog(BaseActivity.this);this.mPD.setTitle(pTitleResID);this.mPD.setIcon(android.R.drawable.ic_menu_save);this.mPD.setIndeterminate(false);this.mPD.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);this.mPD.show();super.onPreExecute();}@Overridepublic T doInBackground(final Void... params) {try {return pCallable.call(new IProgressListener() {@Overridepublic void onProgressChanged(final int pProgress) {onProgressUpdate(pProgress);}});} catch (final Exception e) {this.mException = e;}return null;}@Overridepublic void onProgressUpdate(final Integer... values) {this.mPD.setProgress(values[0]);}@Overridepublic void onPostExecute(final T result) {try {this.mPD.dismiss();} catch (final Exception e) {Debug.e("Error", e);/* Nothing. */}if(this.isCancelled()) {this.mException = new CancelledException();}if(this.mException == null) {pCallback.onCallback(result);} else {if(pExceptionCallback == null) {Debug.e("Error", this.mException);} else {pExceptionCallback.onCallback(this.mException);}}super.onPostExecute(result);}}.execute((Void[]) null);}/** * Performs a task in the background, showing an indeterminate {@link ProgressDialog}, * while the {@link AsyncCallable} is being processed. * * @param <T> * @param pTitleResID * @param pMessageResID * @param pErrorMessageResID * @param pAsyncCallable * @param pCallback * @param pExceptionCallback */protected <T> void doAsync(final int pTitleResID, final int pMessageResID, final AsyncCallable<T> pAsyncCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {final ProgressDialog pd = ProgressDialog.show(BaseActivity.this, this.getString(pTitleResID), this.getString(pMessageResID));pAsyncCallable.call(new Callback<T>() {@Overridepublic void onCallback(final T result) {try {pd.dismiss();} catch (final Exception e) {Debug.e("Error", e);/* Nothing. */}pCallback.onCallback(result);}}, pExceptionCallback);}// ===========================================================// Inner and Anonymous Classes// ===========================================================public static class CancelledException extends Exception {private static final long serialVersionUID = -78123211381435596L;}}?