Android(java)回调函数经典示例

回调函数经典示例

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

?

时间: 2024-12-12 07:47:11

Android(java)回调函数经典示例的相关文章

JAVA回调函数ANDROID中典型的回调地方

在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序. 在JAVA里面我们使用接口的方式来实现函数的回调. 回调的通俗就是:程序员阿祥写了一段程序(CallPerson)其中有回调函数的接口(PhoneCall),并且封装好了程序(CallPerson).程序员阿呆写了程序(MumCall)要让 阿祥写的程序(CallPerson)调用阿呆写的程序(MumCall)中的方法.于是阿祥的程序(CallPerson)通过程序中(

Java回调函数详解

为了了解什么是回调函数,在网上查阅了如下资料,整理如下: 资料一: 首先说说什么叫回调函数? 在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就 称为回调.在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃. 这样的解释似乎还是比较难懂,这里举个简 单的例子: 程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程

Android中回调函数的理解---本人Android纯新手

本人大二,刚刚接触Android,也刚刚申请的cnblog博客,说一下对Android中回调函数的理解,Android中回调函数和C++.JAVA中的默认构造函数差不多,即运行到了一定的代码时自动调用的代码,而Android中的回调函数和C++.JAVA中的默认构造函数的区别在于:C++.JAVA中的默认构造函数在创建一个对象时自动调用,而Android中的回调函数的自动调用是在比如按了HOME键之后.

一个简单的java回调函数的实现

回调函数 回调函数涉及的3个函数 登记回调函数 回调函数 响应回调函数 简单的解释 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件.回答完毕.来自知乎点击打开链接 代码的实现 首先有一个接口 interface CallB

java回调函数机制

Java回调函数机制 参考了网上的一些资料,下面也做出一些总结,供初学者了解学习. 一. 概述 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调.异步调用 . 同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用: 回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 异步调用:一种类似消息或事件的机制,解决了同步阻塞的问题,它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户

Java回调函数的理解与实现

回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 在Java里面,我们使用接口来实现回调.举个例子 所谓的回调,就是程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法. 举个例子: 1.  首先定义一个类Caller,按照上面的定义就是程序员A写的程序a,这个类里面保存一个接口引用. public class C

了解java回调函数

在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序.(维基百科) C的回调 在C/C++中,回调函数是一个通过函数指针调用的函数,当你把函数的指针作为参数传递给另外一个函数.当这个指针被用来调用其所指向的函数时,我们称这样的函数为回调函数. 实用情况举例: 1. 假设要编写一个库,其中提供了某些排序算法.(如冒泡排序,快

android setOnClickListener 回调函数理解

1.模拟java View类: package com.test; /** * Created by dandan on 15-2-7. */ public class View { /**设置默认ID**/ public static final int NO_ID = -1; /**设置每个控件的ID用于被子类覆盖**/ public int mID = NO_ID; /**保存点击回调函数**/ public OnClicklistener mOnClicklistener; public

转Java 回调函数的理解

所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数.例如Win32下的窗口过程函数就是一个典型的回调函数.一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供.由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数.Web Service以及Java的RMI都用到回调机制,可