回调函数经典示例


1.使用java回调函数来实现一个测试函数运行时间的工具类

public class TestObject {       /**       * 一个用来被测试的方法,进行了一个比较耗时的循环       */      public static void testMethod(){           for ( int i= 0 ; i< 100000000 ; i++){            }       }       /**       * 一个简单的测试方法执行时间的方法       */      public void testTime(){           long begin = System.currentTimeMillis(); //测试起始时间           testMethod(); //测试方法           long end = System.currentTimeMillis(); //测试结束时间           System.out.println("[use time]:" + (end - begin)); //打印使用时间       }       public static void main(String[] args) {           TestObject test=new TestObject();           test.testTime();       }   }


大家看到了testTime()方法,就只有"//测试方法"是需要改变的,下面我们来做一个函数实现相同功能但更灵活:


2.首先定一个回调接口

public interface CallBack {       //执行回调操作的方法       void execute();   } 


3.定义工具类

public class Tools {        /**       * 测试函数使用时间,通过定义CallBack接口的execute方法       * @param callBack       */      public void testTime(CallBack callBack) {           long begin = System.currentTimeMillis(); //测试起始时间           callBack.execute(); ///进行回调操作           long end = System.currentTimeMillis(); //测试结束时间           System.out.println("[use time]:" + (end - begin)); //打印使用时间       }  

?

?

4.测试方法

public static void main(String[] args) {       Tools tool = new Tools();       tool.testTime(new CallBack(){           //定义execute方法           public void execute(){               //这里可以加放一个或多个要测试运行时间的方法               TestObject.testMethod();           }      });}


项目中回调的使用

需求描述:

自定义相机拍摄完成照片后,在处理图片data的PictureCallback中使用回调

目的:

需要图像生成时处理完成(如,质量,大小,等比例压缩)后,在回调中使用Jni提取图像特征,访问网络达到图像识别的功能

1.声明接口

package app.ui.callback;/** * @author gao_chun * */public interface MyCallBack {    public void cameraHasOpened();      //Camera    public void toDistinguish();        //识别}


2.CameraInterface类中的PictureCallback,提供回调set方法

public class CameraInterface {    private static final String TAG = "gao_chun";    public boolean isCameraStop = false;        //标记相机是否打开或关闭    private Camera mCamera;    private Camera.Parameters mParams;    private boolean isPreviewing = false;    private float mPreviwRate = -1f;    //识别回调    private  MyCallBack mCallBack;    public void setmCallBack(MyCallBack mCallBack) {        this.mCallBack = mCallBack;    }    /**     * 拍照     */    public void doTakePicture(){        if(isPreviewing && (mCamera != null)){            mCamera.takePicture(mShutterCallback, null, mJpegPictureCallback);        }    }    //对jpeg图像数据的回调,最重要的一个回调    PictureCallback mJpegPictureCallback = new PictureCallback()    {        public void onPictureTaken(byte[] data, Camera camera) {            Log.i(TAG, "myJpegCallback:onPictureTaken...");            Bitmap mBitmap = null;            if(null != data){                //data是字节数据,将其解析成位图                mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);                mCamera.stopPreview();                isPreviewing = false;            }            if(null != mBitmap)            {                Bitmap newBitmap = FileOperation.scaleToBitmap(mBitmap,FileOperation.scale);                //根据Bitmap图片宽高,按比例计算                /*int w = mBitmap.getWidth();                int h = mBitmap.getHeight();                int scale = 512;    //默认比例                int max = w > h ? w : h;                float r =  scale * 1.0f / max;                int ww = (int)Math.ceil(w * r);                int hh = (int)Math.ceil(h * r);                Bitmap mBitmap = FileOperation.zoomImg(rotaBitmap,ww,hh);*/                //FileOperation.delFile(FileOperation.FILENAME_ICON);//删除图片                FileOperation.saveBitmap(newBitmap,FileOperation.FILENAME_ICON);//保存图片                //回调方法,需要执行的操作                mCallBack.toDistinguish();                mBitmap = null;                newBitmap = null;            }            //再次进入预览            mCamera.startPreview();            isPreviewing = true;        }    };}


3.CameraActivity类实现该接口和方法

public class CameraActivity extends TitleActivity implements MyCallBack { /* (non-Javadoc)     * @see app.ui.widget.TitleActivity#onClick(android.view.View)* 点击拍摄图像,并回调处理     */    @Override    public void onClick(View v) {        super.onClick(v);        switch(v.getId()){            case R.id.shutter:                CameraInterface.getInstance().doTakePicture();//拍照                //判断SDcard中特征文件                if(!FileOperation.checkFileExist(FileOperation.FILENAME_AVG) ||                        !FileOperation.checkFileExist(FileOperation.FILENAME_VEC)){                    //读取assets目录下的文件写入sdcard                    FileOperation.readAssetsAndWrite(this, "avg.txt");                    FileOperation.readAssetsAndWrite(this, "vec.txt");                }                mLoading.show();                //设置识别回调                CameraInterface.getInstance().setmCallBack(this);                //不可再次点击                shutterView.setClickable(false);                break;            default:                break;        }    } /* (non-Javadoc)     * @see app.ui.callback.MyCallBack#toDistinguish()     * 图像识别     */    @Override    public void toDistinguish() {        // TODO Auto-generated method stub        if(FileOperation.checkFileExist(FileOperation.FILENAME_ICON)){            getPictureFeature();//提取图像特征        }else {            DialogUtils.showToast(CameraActivity.this,"图像保存不完整,请重新拍摄");        }    } /**     * 1.获得图像路径和特征文件     * 2.使用jni提取特征     * 3.访问服务器     */    private void getPictureFeature(){        //读取图像和提取特征参数        mPicPath = FileOperation.getFilePath() + FileOperation.FILENAME_ICON;        mVecPath = FileOperation.getFilePath() + FileOperation.FILENAME_VEC;        mAvgPath = FileOperation.getFilePath() + FileOperation.FILENAME_AVG;        //Log.i(TAG,"mPicPath------------->"+mPicPath+"\n  mVecPath----> "+mVecPath+"\n mAvgPath----> "+mAvgPath);        new Thread(){            public void run(){                UseOpensift obj = new UseOpensift();                mTempData = obj.getFeature(mPicPath,mVecPath,mAvgPath);                imageRecognition(mTempData);  //提交数据            }        }.start();    }}

?

更多相关文章

  1. Android视图加载流程(6)之View的详细绘制流程Draw
  2. Android解决大图片内存溢出
  3. Android(安卓)各种第三方轮子
  4. DataBinding使用指南(四):BindingAdapter
  5. android studio 常用的快捷键
  6. android rk及allwinner方案bug解决方法集
  7. Android(安卓)网络请求框架Retrofit2.0使用笔记
  8. Android24_Service初步
  9. android——读写内部和外部存储方法

随机推荐

  1. 访问器的原理及DOM元素
  2. 函数的参数和返回值问题以及模板字面量和
  3. 通过Setters方式对日期属性及日期格式进
  4. 初识HTML标签功能
  5. 通过Setters方式对日期属性及日期格式进
  6. 访问JSP文件或者Servlet文件时提示下载的
  7. JSP程序使用JDBC连接MySQL的教程
  8. 实例演示函数参数与返回值、演示模板字面
  9. 1. 实例演示函数参数与返回值 2. 实例演
  10. 常用函数类型和数据类型