// The callback interface
interface MyCallback {
void callbackCall();
}
// The class that takes the callback
class Worker {
MyCallback callback;
void onEvent() {
callback.callbackCall();
}
}
// Option 1:
class Callback implements MyCallback {
void callbackCall() {
// callback code goes here
}
}
worker.callback = new Callback();
// Option 2:
worker.callback = new MyCallback() {
void callbackCall() {
// callback code goes here
}
};
我可能在选项2中弄错了语法,还太早。
当我的视图发生某些事情时,我会触发一个事件,我的活动在监听该事件:
// 在(自定义)视图中声明
private OnScoreSavedListener onScoreSavedListener;
public interface OnScoreSavedListener {
public void onScoreSaved();
}
// ALLOWS YOU TO SET LISTENER && INVOKE THE OVERIDING METHOD
// FROM WITHIN ACTIVITY
public void setOnScoreSavedListener(OnScoreSavedListener listener) {
onScoreSavedListener = listener;
}
// 在Activity中声明
MyCustomView slider = (MyCustomView) view.findViewById(R.id.slider)
slider.setOnScoreSavedListener(new OnScoreSavedListener() {
@Override
public void onScoreSaved() {
Log.v("","EVENT FIRED");
}
});
如果你想了解更多关于片段之间通信(回调)的内容,请参见这里: http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
android.os.Handler.Callback
。传递一个类型为Callback的对象,并调用回调函数的handleMessage(Message msg)
方法。使用接口实现回调方法的示例。
定义接口NewInterface.java。
包:javaapplication1
public interface NewInterface {
void callback();
}
创建一个新类,NewClass.java。它将在主类中调用回调方法。
package javaapplication1;
public class NewClass {
private NewInterface mainClass;
public NewClass(NewInterface mClass){
mainClass = mClass;
}
public void calledFromMain(){
//Do somthing...
//call back main
mainClass.callback();
}
}
主类JavaApplication1.java要实现接口NewInterface的回调方法callback()。它将创建并调用NewClass对象。然后,NewClass对象将依次回调它自己的callback()方法。
package javaapplication1;
public class JavaApplication1 implements NewInterface{
NewClass newClass;
public static void main(String[] args) {
System.out.println("test...");
JavaApplication1 myApplication = new JavaApplication1();
myApplication.doSomething();
}
private void doSomething(){
newClass = new NewClass(this);
newClass.calledFromMain();
}
@Override
public void callback() {
System.out.println("callback");
}
}
为了进一步澄清龙答案的内容(因为我花了一些时间才弄清楚该如何处理Handler.Callback
),Handler
可用于通过传递Message
在当前线程或另一个线程中执行回调函数。 Message
保存用于从回调中使用的数据。可以将Handler.Callback
传递给Handler
的构造函数,以避免直接扩展Handler。因此,要通过回调在当前线程中执行某些代码:
Message message = new Message();
<set data to be passed to callback - eg message.obj, message.arg1 etc - here>
Callback callback = new Callback() {
public boolean handleMessage(Message msg) {
<code to be executed during callback>
}
};
Handler handler = new Handler(callback);
handler.sendMessage(message);
编辑:刚刚意识到有一种更好的方法可以获得相同的结果(除了不能精确控制回调函数何时执行):
post(new Runnable() {
@Override
public void run() {
<code to be executed during callback>
}
});
Callback
版本,因为在构造Runnable.run()
时可能没有访问所需数据的权限。 - Kirby您也可以使用LocalBroadcast
来实现这个目的。以下是一个快速指南:
创建广播接收器:
LocalBroadcastManager.getInstance(this).registerReceiver(
mMessageReceiver, new IntentFilter("speedExceeded"));
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Double currentSpeed = intent.getDoubleExtra("currentSpeed", 20);
Double currentLatitude = intent.getDoubleExtra("latitude", 0);
Double currentLongitude = intent.getDoubleExtra("longitude", 0);
// ... react to local broadcast message
}
以下是如何触发它的方法
Intent intent = new Intent("speedExceeded");
intent.putExtra("currentSpeed", currentSpeed);
intent.putExtra("latitude", latitude);
intent.putExtra("longitude", longitude);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
在onPause中取消注册接收器:
protected void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
}
fun main() {
val worker = Worker()
worker.setOnCallListener(
object: OnCallListener {
override fun onCall() {
// here we define what should happen
// when the event accures
print("event happend")
}
}
)
// most events will be called from Android system itself
// but in our case we have to call it manually
worker.listener.onCall()
}
Worker
类有一个OnCallListener
接口类型的实例,以及一个设置其值的方法:
class Worker() {
lateinit var listener: OnCallListener
fun setOnCallListener(listener: OnCallListener) {
this.listener = listener
}
}
而 OnCallListener
接口看起来像这样:
interface OnCallListener {
fun onCall()
}