1.回调函数
回调函数的定义为:程序C调用S中的函数A,通过这个函数进入到程序S中,程序S执行代码到一定程度会反过来调用程序C中的函数B,这个函数B对于程序C来讲就叫做回调函数。
回调函数的理解:(1)程序C不直接调用程序内的回调函数B,而是通过程序A间接地对回调函数B进行回调;
(2)程序S必须事先知道回调函数的函数原型,方便进行调用,因此必须事先约定一个接口(interface B),规定传输的参数类型,返回值类型;
(3)回调函数B是对接口(interface B)的实现;也就是说,服务器程序S以及接口相当于设计了一个框架,而客户端程序C内部会对回调函数B进行实现;
(4)回调的过程:程序C通过调用函数A将自己的程序入口地址传给程序S,程序S运行后,会通过传过来的入口地址来访问程序C并调用内部的回调函数B,调用时,将服务程序运行中的数据作为回调函数参数传递给程序C,从而实现了服务程序与客户程序之间的通信。
2.回调函数在Android中的应用----Dialog与Activity之间的通信
在Android开发中会遇到这样的情况:Activity中激活了Dialog,在Dialog如果实现了对某个图片的选择,那么需要将图片的路径地址传递给Activity以告诉Activity选择了哪一张图片,这时候我们就可以用回调函数来实现了。
实现的过程如下:
(1)首先,我们需要定义一个接口,这个接口用于声明传输参数的类型,以及返回类型。在此以图片地址作为参数来,类型为String:
1 public interface DialogListener { 2 //获得图片地址的回调函数的接口函数 3 public void getImageAddr(String addr); 4 }
(2)自定义一个类MyDialog继承Dialog,在该类中定义一个将回调函数地址传入的方法setDialogListener(相当于对回调函数进行了注册),并在需要进行传输的地方对回调函数getImageAddr进行调用。调用函数是的参数就是需要传递给Activity的图片地址。
package haitun.textchat; import haitun.Interface.DialogListener; import haitun.pictureInfo.PictureInfo; import haitun.sdcard.FileUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.app.Dialog; import android.content.Context; import android.graphics.Bitmap; import android.os.Bundle; import android.view.View; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView; import android.widget.GridView; import android.widget.ImageView; import android.widget.SimpleAdapter; import android.widget.SimpleAdapter.ViewBinder; public class MyDialog extends Dialog{ Context context; DialogListener dialogListener=null; public MyDialog(Context context){ super(context); this.context=context; } public MyDialog(Context context,int theme){ super(context,theme); this.context=context; } /**********通过这个方法,将回调函数的地址传入到MyDialog中*********/ public void setDialogListener(DialogListener listener){ this.dialogListener=listener; } private GridView gridView=null; List<Bitmap> imageList=null; SimpleAdapter adapter=null; List<PictureInfo> picInfolist=null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.picture); gridView=(GridView)findViewById(R.id.gridView); PictureInfo picInfo=new PictureInfo(); FileUtils file=new FileUtils(); picInfolist=file.getPictureFiles("haitun/picture"); imageList=picInfo.getImageList(picInfolist); List<HashMap<String,Object>> listImage=new ArrayList<HashMap<String,Object>>(); for (int i = 0; i < imageList.size(); i++) { HashMap<String, Object> map=new HashMap<String, Object>(); map.put("itemImage",imageList.get(i)); listImage.add(map); } String[] from=new String[]{"itemImage"}; int[] to =new int[]{R.id.image_ItemImage}; adapter=new SimpleAdapter(MyDialog.this.context,listImage, R.layout.cell, from,to); /************将图片和数据绑定*************/ adapter.setViewBinder(new ViewBinder() { @Override public boolean setViewValue(View view, Object data, String textRepresentation) { // TODO Auto-generated method stub if(view instanceof ImageView && data instanceof Bitmap){ ImageView i = (ImageView)view; i.setImageBitmap((Bitmap) data); return true; } return false; } }); gridView.setAdapter(adapter); gridView.setOnItemClickListener(listener); } /**************监听图片选择*************/ OnItemClickListener listener=new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub dismiss(); String addr=picInfolist.get(arg2).getPicFileName();//得到图片的路径地址 System.out.println(""+addr); dialogListener.getImageAddr(addr); //传递图片地址的回调函数 } }; }
(3)在Activity中完成对回调函数接口的实现,并接实现后的匿名内部类的作为参数传给setDilalogListener方法。这个接口实现后的内部内方法中会监听Dialog中的是否会调用该方法,当MyDialog中调用了该方法,就会将图片地址传过来,并执行回调函数中内容。
MyDialog dialog=new MyDialog(ChatActivity.this); dialog.setDialogListener(dialogListener); dialog.show(); DialogListener dialogListener=new DialogListener(){ @Override public void getImageAddr(String addr) { // TODO Auto-generated method stub //一直等待被调用
//作为参数传递进来的addr字符串就是图片地址
Toast.makeText(ChatActivity.this,""+addr, Toast.LENGTH_SHORT).show(); Bitmap bitmap=BitmapFactory.decodeFile(addr); listViewUpdate(config.getUserName()+":", bitmap); } };