package vandy.mooc.presenter.strategies; import java.lang.ref.WeakReference; import vandy.mooc.common.Utils; import android.graphics.Bitmap; import android.os.Handler; import android.os.Message; /** * Use the Handlers and Messages defined by the HaMeR framework to * download a bitmap image in a background thread and then display it * in the UI thread. This class plays the role of the "Concrete * Strategy" in the Strategy pattern. */ public class DownloadWithMessages implements ImageStrategy { /** * Thread object that's used for the download. */ private Thread mThread = null; /** * Types of Messages that can be passed from a background Thread * to the UI Thread to specify which processing to perform. */ public static final int SHOW_TOAST = 1; public static final int DISPLAY_IMAGE = 2; /** * Creates and starts a Thread that downloads an image in the * background and then use Messages to display the image in the UI * Thread. */ @Override public void downloadAndDisplay(final DownloadContext downloadContext) { // Handler whose handleMessage() hook method processes // Messages sent to it from a background Thread. final Handler messageHandler = new Handler() { /** * Process the specified Messages passed to the * Handler in the UI Thread. These Messages instruct * the Handler to start showing the progress dialog, * dismiss it, or display the designated bitmap image * via the ImageView. */ public void handleMessage(Message msg) { switch (msg.what) { case SHOW_TOAST: downloadContext.showToast("downloading via Handlers and Messages"); break; case DISPLAY_IMAGE: // Display the downloaded image to the user. downloadContext.displayBitmap((Bitmap) msg.obj); break; } } }; final Runnable downloadRunnable = new Runnable() { /** * Download a bitmap image in a background Thread by * sending Messages to the mHandler running in the UI * Thread. */ @Override public void run() { // Factory creates a Message that instructs the // MessageHandler to post the toast to the user. Message msg = messageHandler.obtainMessage(SHOW_TOAST); // Send the Message to show the toast. messageHandler.sendMessage(msg); // Download the image. final Bitmap image = downloadContext.downloadBitmap(downloadContext.getUrl()); // Factory creates a Message that instructs the // MessageHandler to display the image to the user. msg = messageHandler.obtainMessage(DISPLAY_IMAGE, image); // Send the Message to instruct the UI Thread to // display the image. messageHandler.sendMessage(msg); } }; // Create and Start a new Thread to perform the download and // display the results to the user. mThread = new Thread(downloadRunnable); mThread.start(); } /** * Cancel the download/display. */ @Override public void cancel(DownloadContext downloadContext) { // Let the user know this download/display is being canceled. downloadContext.showToast("Canceling DownloadWithMessages in progress"); // Interrupt the Thread so it will stop the download/display. mThread.interrupt(); } }