您的位置:首页 > 移动开发 > Android开发

Android中的回调机制

2015-05-11 22:49 148 查看
        从学习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 = "https://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>

就那么几个文件,我就不上传源码了,想要源码的留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: