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类
就那么几个文件,我就不上传源码了,想要源码的留言。
最主要的就是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>
就那么几个文件,我就不上传源码了,想要源码的留言。
相关文章推荐
- android源码分析——从button的点击事件看回调机制
- Android中的接口回调详解,回调机制:以Activity和Adapter传递数据为例。
- Android技术开发之接口回调机制总结
- android的回调机制
- Android回调机制小例子--作者:RiverAM
- Android基础入门教程——3.2 基于回调的事件处理机制
- Android 回调机制
- Android开发之Fragment与Activity的数据交互通过回调机制实现(源代码分享)
- android 回调机制
- 【Android与iOS开发对比系列】之 回调机制
- 浅谈Android中的回调机制CallBack
- Android java回调机制与自定义接口回调方法
- Android回调机制
- java回调机制以及android中的回调方法
- android事件监听回调机制
- Android View的onClick回调机制
- android下的回调机制 分享
- 初识Android 回调机制
- Android 之事件处理(一)基于回调机制的事件处理
- Java回调机制在Android中的应用