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); } };