在最近的Google IO期间,有一个关于实现restful客户端应用程序的演示文稿.不幸的是,这只是一个高级别的讨论,没有实现的源代码.
在此图中,在返回路径上有各种不同的回调到其他方法.
我如何声明这些方法是什么?
我理解回调的想法 - 在某个事件发生后调用的一段代码,但我不知道如何实现它.到目前为止,我实现回调的唯一方法是覆盖各种方法(例如onActivityResult).
我觉得自己对设计模式有了基本的了解,但是我一直在探索如何处理返回路径.
在许多情况下,您有一个接口并传递实现它的对象.例如,对话框具有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类型的对象,并调用回调函数handleMessage(Message msg)
.
使用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"); } }
澄清一下龙的答案(因为我花了一些时间来弄清楚该怎么做Handler.Callback
):
Handler
可以用来通过传递它来在当前或另一个线程中执行回调Message
.所述Message
保持待从回调使用的数据.a Handler.Callback
可以传递给构造函数,Handler
以避免直接扩展Handler.因此,通过当前线程的回调执行一些代码:
Message message = new Message();Callback callback = new Callback() { public boolean handleMessage(Message msg) { } }; Handler handler = new Handler(callback); handler.sendMessage(message);
编辑:刚刚意识到有一个更好的方法来获得相同的结果(减去对何时执行回调的确切控制):
post(new Runnable() {
@Override
public void 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中的unRegister接收器:
protected void onPause() { super.onPause(); LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); }