package com.mycompany.android; import java.lang.ref.WeakReference; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.os.AsyncTask; import android.widget.Toast; import com.mycompany.android.R; /** * °³¼±µÈ AsyncTask. * * ¡Û android.os.AsyncTask¿Í ´Ù¸¥Á¡ * - Activity¿¡ ´ëÇÑ ¾àÇÑ ÂüÁ¶(weak reference) À¯Áö * - onPreExecute¿¡¼­ 'ÀÛ¾÷ó¸®Áß' ÇÁ·Î±×·¹½º ´ÙÀ̾ó·Î±× ÀÚµ¿ ½ÃÀÛ * - onPostExecute¿¡¼­ ÇÁ·Î±×·¹½º ´ÙÀ̾ó·Î±× ÀÚµ¿ Á¾·á * - doInBackground¿¡¼­ ¿¡·¯¹ß»ý½Ã(throws exception) ÇÁ·Î±×·¹½º ´ÙÀ̾ó·Î±× * ÀÚµ¿ Á¾·á ¹× ¿¡·¯¸Þ½ÃÁö Å佺Ʈ º¸¿©ÁÜ * - Âü°í·Î doInBackground¿¡¼­ ¿¡·¯¹ß»ý½Ã ÇÏÀ§ Ŭ·¡½ºÀÇ onPostExecute´Â ½ÇÇàµÇÁö ¾ÊÀ½ * - 'ÀÛ¾÷ó¸®Áß' ÇÁ·Î±×·¹½º ´ÙÀ̾ó·Î±×¿¡¼­ »ç¿ëÀÚ°¡ Ãë¼ÒÅ° ´©¸£¸é onCancelled ½ÇÇà * - onCancelled¿¡¼­ ÇÁ·Î±×·¹½º ´ÙÀ̾ó·Î±× ÀÚµ¿ Á¾·á ¹× ÀÛ¾÷Ãë¼Ò ¸Þ½ÃÁö º¸¿©ÁÜ * * - ÂüÁ¶ : * http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html * http://tigerwoods.tistory.com/28 * */ public abstract class EnhancedAsyncTask extends AsyncTask { protected WeakReference mTarget; protected Throwable mException = null; protected ProgressDialog mProgressDialog; /** ÀÛ¾÷ó¸®Áß ´ÙÀ̾ó·Î±×¿¡ º¸¿©ÁÙ ¸Þ½ÃÁö */ protected int mTaskProcessingMessage = R.string.task_progressing;//ó¸®ÁßÀÔ´Ï´Ù. Àá½Ã¸¸ ±â´Ù¸®½Ê½Ã¿À... /** ÀÛ¾÷Ãë¼Ò½Ã º¸¿©ÁÙ ¸Þ½ÃÁö */ protected int mTaskCancelledMessage = R.string.task_cancelled;//ÀÛ¾÷ÀÌ Ãë¼ÒµÇ¾ú½À´Ï´Ù. /** ÀÛ¾÷ó¸®Áß ´ÙÀ̾ó·Î±×¸¦ º¸¿©ÁÙÁö ¿©ºÎ */ protected boolean mProgressDialogEnabled = true; public EnhancedAsyncTask(WeakTarget target) { mTarget = new WeakReference(target); } /** {@inheritDoc} */ @Override protected final void onPreExecute() { final WeakTarget target = mTarget.get(); if (target != null) { showProgress(target); this.onPreExecute(target); } } /** {@inheritDoc} */ @Override protected final Result doInBackground(Params... params) { final WeakTarget target = mTarget.get(); if (target != null) { try { return this.doInBackground(target, params); } catch (Throwable t) { this.mException = t; return null; } } else { return null; } } /** {@inheritDoc} */ @Override protected final void onPostExecute(Result result) { final WeakTarget target = mTarget.get(); if (target != null) { if (mException != null) { showError(target, mException); return; } dismissProgress(); this.onPostExecute(target, result); } } /** {@inheritDoc} */ @Override protected void onCancelled() { final WeakTarget target = mTarget.get(); if (target != null) { showCancelMessage(target); this.onCancelled(target); } } /** * ÀÛ¾÷Áß ´ÙÀ̾ó·Î±× º¸¿©ÁÜ. * @param message */ protected void showProgress(Context context) { if (mProgressDialogEnabled == false) return; mProgressDialog = new ProgressDialog(context); mProgressDialog.setCancelable(true); mProgressDialog.setOnCancelListener(new OnCancelListener() { public void onCancel(DialogInterface dialog) { //BACK Å° ´©¸£¸é ´ÙÀ̾ó·Î±× ´Ý°í ÇöÀç ÀÛ¾÷ Ãë¼Ò //NOTE: ´ÙÀ̾ó·Î±× ¶°ÀÖ´Â »óÅ¿¡¼­´Â BACKÅ° ´­·¯µµ onBackPressed()´Â ½ÇÇàµÇÁö ¾ÊÀ½ EnhancedAsyncTask.this.cancel(true); } }); String message = context.getString(mTaskProcessingMessage); mProgressDialog.setMessage(message); mProgressDialog.show(); } /** * ÀÛ¾÷Áß ´ÙÀ̾ó·Î±× ´ÝÀ½ */ protected void dismissProgress() { if (mProgressDialogEnabled == false) return; if (mProgressDialog != null) { mProgressDialog.dismiss(); } } /** * ÀÛ¾÷Ãë¼Ò ¸Þ½ÃÁö Ç¥½Ã. ÀÛ¾÷Áß ´ÙÀ̾ó·Î±×´Â ÀÚµ¿ ´ÝÀ½. */ protected void showCancelMessage(Context context) { dismissProgress(); Toast.makeText(context, mTaskCancelledMessage, Toast.LENGTH_SHORT).show(); } /** * ¿¡·¯¸Þ½ÃÁö Ç¥½Ã. ÀÛ¾÷Áß ´ÙÀ̾ó·Î±×´Â ÀÚµ¿ ´ÝÀ½. * @param t */ protected void showError(Context context, Throwable t) { dismissProgress(); //TODO exception Á¾·ù¿¡ µû¶ó ÀûÀýÈ÷ ¿¡·¯¸Þ½ÃÁö ¼±Åà String errorMessage = "¿À·ù°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù."; Toast.makeText(context, errorMessage, Toast.LENGTH_LONG).show(); } //-------------- ÇÏÀ§ Ŭ·¡½º¿¡¼­ ±¸Çö ¶Ç´Â ¿À¹ö¶óÀ̵ùÇÒ ¸Þ¼Òµåµé /** * ÀÛ¾÷ Àü ó¸®. UI°ü·Ã ó¸® °¡´É. * @param target */ protected void onPreExecute(WeakTarget target) { // No default action } /** * ½ÇÁ¦ ¹é±×¶ó¿îµå ÀÛ¾÷ó¸®. * * ¿©±â¼­ ExceptionÀÌ ´øÁ®Áö¸é onPostExecute¿¡¼­ ÀÚµ¿À¸·Î ÇØ´ç ExceptionÀÌ Ã³¸®µÊ. * ÇÏÀ§Å¬·¡½º¿¡¼­ try/catch·Î Á÷Á¢ exceptionÀ» Àâ¾Æ¼­ º°µµ 󸮰¡´É. * * @param target * @param params * @return */ protected abstract Result doInBackground(WeakTarget target, Params... params); /** * ÀÛ¾÷ ÈÄ Ã³¸®. UI°ü·Ã ó¸® °¡´É. * @param target * @param result */ protected void onPostExecute(WeakTarget target, Result result) { // No default action } /** * ÀÛ¾÷ Ãë¼Ò ó¸®. UI°ü·Ã ó¸® °¡´É. * @param target */ protected void onCancelled(WeakTarget target) { // // No default action } }