回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,常用于异步获取处理结果(耗时或处理时间不确定的操作)。
需要定义三个类,分别是主函数类,callback函数的接口类,耗时业务处理类,在业务处理类中,处理完业务之后,执行一个callback函数。
文件:CallBack.java (接口)
package com.sysnotify.lewes.sysnotify_test; /* 创建一个callback接口 * 用于实现java回调,请仔细阅读下面的注释 * */ public interface CallBack { public void onEndcallback(); } //用法 /* //主函数class public class Main { public static void main(String[] args) { //入口方法 new TestCallBack().compute(1000, new ComputeCallBackFun() { // 回调函数 public void onComputeEnd() { System.out.println("end callback!!!"); } }); } } //耗时class public class TestCallBack { //耗时类中要有一个接受callback的入口函数 public void compute(int n, CallBack callback) { { //执行耗时操作 for (int i = 0; i < n; i++) { System.out.println(i); } } // 执行完调用这个规定格式的callback callback.onEndcallback(); } } */
在调试代码的时候我们需要查看调试信息,那我们就需要用Android Log类。原型Log.v(String tag, String msg)
android.util.Log常用的方法有以下5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() 。根据首字母对应VERBOSE,DEBUG,INFO, WARN,ERROR。
1、Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时使用就是Log.v("","");
2、Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择.
3、Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息
4、Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。
5、Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了。
文件:camerainfo.java (CordovaPlugin入口文件)
这里可以看做class A,由Cordova自动实例化,但无法获取其实例对象地址
package lewes; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaArgs; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.PluginResult; import org.json.JSONException; //class A public class camerainfo extends CordovaPlugin{ @Override public boolean execute(String action, CordovaArgs args, final CallbackContext callbackContext) throws JSONException { // 注册监听器-拍照事件 if("init".equals(action)){ new CameraReceiver().setCallback(new CallBack(){ @Override public void onEndcallback() { //在运行正确时,返回true,无传值用.success //callbackContext.success(); // 如果需要返回数值(字符串,对象等),可以用PluginResult; // 若返回错误要改PluginResult.Status.ERROR PluginResult mPlugin = new PluginResult(PluginResult.Status.OK, "photo get!"); mPlugin.setKeepCallback(true); callbackContext.sendPluginResult(mPlugin); } } ); return true; } //传递消息到js 方法1 执行回调 callbackContext.error("error"); return false; } }
//AndroidManifest.xml 在<application>标签内增加以下内容
<receiver android:enabled="true" android:name="lewes.CameraReceiver"> <intent-filter android:priority="2147483647"> <action android:name="android.hardware.action.NEW_PICTURE" /> <data android:mimeType="image/*" /> </intent-filter> </receiver>
//camerainfo.java
package lewes; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent;
//class B public class CameraReceiver extends BroadcastReceiver { public static CallBack cb;//关键是在这创建一个静态变量,保存传过来的callback指针
public void setCallback(CallBack callback){ cb=callback; } @Override public void onReceive(Context context, Intent intent) { cb.onEndcallback(); } }
文件:CallBack.java (接口)
//文章开头已给出,注释此略
package com.sysnotify.lewes.sysnotify_test;
/* 创建一个callback接口
* */
public interface CallBack {
public void onEndcallback();
}
最终实现思路:java用接口(interface)来实现回调,所以首先定义一个名叫callback的接口,它有一个函数onEndCallback().
在class B 中创建一个接收callback指针的函数 setCallback(CallBack callback),一个储存callback指针的静态变量 public static CallBack cb
在class A 中实现接口的方法onEndCallback() (本文的这里使用了匿名类生成接口 参见http://www.cnblogs.com/yjmyzz/p/3448330.html)
并创建一个class B的实例,用来传递callback指针 new CameraReceiver().setCallback(callback指针)
最终,在class B 的接收事件产生时调用cb.onEndCallback()完成回调。
如果还没看懂,结合代码多看几遍。。。。
原文:http://www.cnblogs.com/longson/p/6246046.html