在最近的Google IO期间,有一个关于实现restful客户端应用程序的演示文稿。不幸的是,这只是一次高级别的讨论,没有实施的源代码。
在此图中,在返回路径上,有其他方法的各种不同回调。
如何声明这些方法是什么?
我理解回调的想法 - 在某个事件发生后调用的一段代码,但我不知道如何实现它。到目前为止,我实现回调的唯一方法是覆盖各种方法(例如onActivityResult)。
我觉得自己对设计模式有了基本的了解,但是我一直在探索如何处理返回路径。
答案 0 :(得分:212)
在许多情况下,您有一个接口并传递实现它的对象。例如,对话框具有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中的语法。现在还早。
答案 1 :(得分:50)
当我的视图中发生某些事情时,我会触发我的活动正在侦听的事件:
//宣布(自定义)视图
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
答案 2 :(得分:37)
当您可以使用现有界面时,无需定义新界面:android.os.Handler.Callback
。传递Callback类型的对象,并调用回调的handleMessage(Message msg)
。
答案 3 :(得分:24)
使用interface实现回调方法的示例。
定义界面 NewInterface.java 。
package 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");
}
}
答案 4 :(得分:20)
澄清龙的答案(因为我花了一些时间来弄清楚如何处理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>
}
});
答案 5 :(得分:11)
您也可以使用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);
}