package vandy.mooc.view;
import java.lang.ref.WeakReference;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Message;
/**
* This class downloads a bitmap image in the background using
* Handlers and Messages.
*/
public class DownloadWithMessages
implements Runnable {
/**
* The URL to download.
*/
final String mUrl;
/**
* WeakReference enable garbage collection of Activity.
*/
final WeakReference<ImageDownloadsActivity> mActivity;
/*
* Types of Messages that can be passed from a background
* Thread to the UI Thread to specify which processing to
* perform.
*/
static final int SHOW_DIALOG = 1;
static final int DISMISS_DIALOG = 2;
static final int DISPLAY_IMAGE = 3;
/**
* Extends Handler and uses its handleMessage() hook method to
* process Messages sent to it from a background Thread.
*/
final Handler mMessageHandler =
new Handler() {
/**
* Process the specified Messages passed to MessageHandler 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) {
// Check to see if the activity still exists and return if
// not.
switch (msg.what) {
case SHOW_DIALOG:
// Inform the user that the download is starting.
mActivity.get().showDialog("downloading via Handlers and Messages");
break;
case DISMISS_DIALOG:
// Dismiss the progress dialog.
mActivity.get().dismissDialog();
break;
case DISPLAY_IMAGE:
// Display the downloaded image to the user.
mActivity.get().displayBitmap((Bitmap) msg.obj);
break;
}
}
};
/**
* Class initializes the fields.
*
* @param activity
* The enclosing Activity
* @param url
* The bitmap image url
*/
DownloadWithMessages(ImageDownloadsActivity activity,
String url) {
mUrl = url;
mActivity =
new WeakReference<>(activity);
}
/**
* Download a bitmap image in a background Thread. It sends
* various messages to the mHandler running in the UI Thread.
*/
public void run() {
// Factory creates a Message that instructs the
// MessageHandler to begin showing the progress dialog to
// the user.
Message msg =
mMessageHandler.obtainMessage(SHOW_DIALOG);
// Send the Message to initiate the ProgressDialog.
mMessageHandler.sendMessage(msg);
// Download the image.
final Bitmap image =
mActivity.get().downloadBitmap(mUrl);
// Factory creates a Message that instructs the
// MessageHandler to dismiss the progress dialog.
msg = mMessageHandler.obtainMessage(DISMISS_DIALOG);
// Send the Message to dismiss the ProgressDialog.
mMessageHandler.sendMessage(msg);
// Factory creates a Message that instructs the
// MessageHandler to display the image to the user.
msg = mMessageHandler.obtainMessage(DISPLAY_IMAGE,
image);
// Send the Message to instruct the UI Thread to display the
// image.
mMessageHandler.sendMessage(msg);
}
}