从学习Android到现在,有意无意都会听到一个叫做回调机制的这么一个东东。例如Activity的生命周期函数就是通过回调机制来实现的,还有为控件添加监听事件时,所实现的接口也是通过回调机制来实现的。起初还真心不知道这是什么东东,到后来有的时候用到的时候也是直接用别人现成的代码,没有搞明白其中是怎么一个实现方式。今天就通过一个从网上下载图片,通过回调机制来通知更新UI的小例子学习了一下回调机制。
最主要的就是DownLoadImage.java类:
package com.xiaotian.callbackmechanism; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import java.net.URL; /** * 下载图片,成功后采用回调机制返回下载后的图片 */ public class DownLoadImage { /** * 下载图片的方法 * * @param imageUrl 下载图片的url * @param callBack 下载完成后的回调接口 */ public static void loadImage(final String imageUrl, final ImageCallBack callBack) { final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { //通知回调 //将下载好的bitmap传入callBack中,当实现这个方法时就可以使用下载好的bitmap了 callBack.getBitmap((Bitmap) msg.obj); } }; //开启新的线程去下载图片 new Thread() { @Override public void run() { try { BitmapDrawable bitmap = (BitmapDrawable) Drawable.createFromStream( new URL(imageUrl).openStream(), ""); Message msg = Message.obtain(); msg.obj = bitmap.getBitmap(); //图片下载完成后通知callBack接口回调getBitmap()方法 handler.sendMessage(msg); } catch (Exception e) { e.printStackTrace(); } } }.start(); } /** * 定义回调接口 */ public interface ImageCallBack { //图片下载完成后回调该方法 public void getBitmap(Bitmap bitmap); } }MainActivity.java类
package com.xiaotian.callbackmechanism; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends ActionBarActivity { //图片的url地址 private String imageUrl = "http://img.blog.csdn.net/20141230130649230?watermark/2" + "/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluZmVuZzI0/font/5a6L5L2T/fontsize/400" + "/fill/I0JBQkFCMA==/dissolve/70/gravity/Center"; //下载等待提示框 private ProgressDialog progressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化提示框 progressDialog = new ProgressDialog(this); progressDialog.setTitle("提示"); progressDialog.setMessage("图片下载中..."); //初始化控件 final ImageView iv = (ImageView) findViewById(R.id.iv); Button load = (Button) findViewById(R.id.load); //为button添加监听时间 load.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { progressDialog.show(); //下载图片 DownLoadImage.loadImage(imageUrl, new DownLoadImage.ImageCallBack() { /** * 实现ImageCallBack的getBitmap()方法 * 图片下载完成后,回调该方法 * @param bitmap 回调该方法时传入的bitmap,即下载完成后的照片 */ @Override public void getBitmap(Bitmap bitmap) { progressDialog.dismiss(); iv.setImageBitmap(bitmap); } }); } }); } }MainActivity的布局文件activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/load" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="下载图片" android:textSize="20sp" android:layout_margin="10dip" /> <ImageView android:id="@+id/iv" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@id/load" android:layout_margin="10dip" /> </RelativeLayout>
就那么几个文件,我就不上传源码了,想要源码的留言。