在最近的Google IO中,有一个有关实现宁静的客户端应用程序的演示。不幸的是,这只是高层讨论,没有实现的源代码。
在此图中,在返回路径上有各种不同的对其他方法的回调。
如何声明这些方法是什么?
我了解回调的想法-在发生某个事件后会调用一段代码,但是我不知道如何实现它。到目前为止,实现回调的唯一方法是重写各种方法(例如onActivityResult)。
我觉得我对设计模式有基本的了解,但是我继续着迷于如何处理返回路径。
在最近的Google IO中,有一个有关实现宁静的客户端应用程序的演示。不幸的是,这只是高层讨论,没有实现的源代码。
在此图中,在返回路径上有各种不同的对其他方法的回调。
如何声明这些方法是什么?
我了解回调的想法-在发生某个事件后会调用一段代码,但是我不知道如何实现它。到目前为止,实现回调的唯一方法是重写各种方法(例如onActivityResult)。
我觉得我对设计模式有基本的了解,但是我继续着迷于如何处理返回路径。
Answers:
在许多情况下,您都有一个接口并传递实现该接口的对象。例如,对话框具有OnClickListener。
就像一个随机的例子:
// 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;
}
//活动中声明
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的对象,并调用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");
}
}
来澄清一下Dragon的答案(因为花了我一段时间才弄清楚该怎么做Handler.Callback
):
Handler
通过传递Message
s 可用于在当前线程或另一个线程中执行回调。将Message
要被从回调使用的数据保持。一个Handler.Callback
可以传递给的构造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()
在构造它时就可以访问所需的数据
您也可以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);
}