package vandy.mooc.presenter.strategies; import android.graphics.Bitmap; import android.os.AsyncTask; /** * Use the AsyncTask framework to download a bitmap image in a * background Thread and display it to the user in the UI Thread. * This class plays the role of the "Concrete Strategy" in the * Strategy pattern. */ public class DownloadWithAsyncTask implements ImageStrategy { /** * AsyncTask that's used to download and display a bitmap image * requested by the user. */ private AsyncTask<String, Void, Bitmap> mDownloader = null; /** * Create and execute an AsyncTask that downloads the image in a * Thread in the pool of Threads. */ @Override public void downloadAndDisplay(final DownloadContext downloadContext) { // Create an AsyncTask to download an image in the background // and display it to the user in the UI Thread. mDownloader = new AsyncTask<String, Void, Bitmap>() { /** * Called by the AsyncTask framework in the UI Thread to * perform initialization actions. */ protected void onPreExecute() { // Show the toast before starting the download in a // background Thread. downloadContext.showToast("downloading via AsyncTask"); } /** * Download a bitmap image in a background thread. * * @param params * The url of a bitmap image * @ @return The Bitmap representation of the downloaded image. */ protected Bitmap doInBackground(String... urls) { // Download the image, which can block since we're in // a background thread. return downloadContext.downloadBitmap(urls[0]); } /** * Called after an operation executing in the background * completes to set the bitmap image to an image view and * dismiss the progress dialog. * * @param image * The bitmap image */ protected void onPostExecute(Bitmap image) { // Display the downloaded image to the user. downloadContext.displayBitmap(image); } }.execute(downloadContext.getUrl()); } /** * Cancel a download/display. */ @Override public void cancel(DownloadContext downloadContext) { // Let the user know this download/display is being canceled. downloadContext.showToast("Canceling DownloadWithAsyncTask in progress"); // Cancel the AsyncTask immediately. mDownloader.cancel(true); } }