Android(java)回呼函數經典樣本

來源:互聯網
上載者:User

標籤: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提取映像特徵,訪問網路達到Image Recognition的功能

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()     * Image Recognition     */    @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();    }}

?

Android(java)回呼函數經典樣本

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.