package vandy.mooc.presenter.strategies; import android.graphics.Bitmap; /** * Use the Runnables and Handlers defined by the HaMeR framework to * implement an ImageStrategy interface that downloads a bitmap image * in a background thread and displays it on the UI thread. This * class plays the role of the "Concrete Strategy" in the Strategy * pattern. */ public class DownloadWithRunnables implements ImageStrategy { /** * Thread object that's used for the download. */ private Thread mThread = null; /** * Creates and starts a new Thread to download an image in the * background via a Runnable. The downloaded image is then * diplayed in the UI Thread by posting another Runnable via the * Activity's runOnUiThread() method, which uses an internal * Handler. */ @Override public void downloadAndDisplay(final DownloadContext downloadContext) { final Runnable downloadRunnable = new Runnable() { /** * Download a bitmap image in a background Thread and then * post a Runnable to the UI Thread to set the image to * the ImageView. */ @Override public void run() { // Download the image. final Bitmap image = downloadContext.downloadBitmap(downloadContext.getUrl()); // Display the downloaded image to the user. downloadContext.displayBitmap(image); } }; // Inform the user that the download is starting with // this particular concurrency strategy. downloadContext.showToast("downloading via Handlers and Runnables"); // 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 operation. */ @Override public void cancel(DownloadContext downloadContext) { // Let the user know this download/display is being canceled. downloadContext.showToast("Canceling DownloadWithRunnable in progress"); // Interrupt the Thread so it will stop the download/display. mThread.interrupt(); } }