提问人:user409841 提问时间:8/3/2010 最后编辑:Haywireuser409841 更新时间:2/15/2023 访问量:260932
如何在Android中定义回调?
How to Define Callbacks in Android?
问:
在最近的 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 中的语法。现在还早。
评论
当可以使用现有接口时,无需定义新接口:。传递一个 Callback 类型的对象,并调用 callback 的 .android.os.Handler.Callback
handleMessage(Message msg)
评论
在我看来,当某些事情发生时,我会触发我的活动正在侦听的事件:
在“(自定义)”视图中声明
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
评论
澄清一下 Dragon 的答案(因为我花了一段时间才弄清楚该怎么做):Handler.Callback
Handler
可用于在当前线程或其他线程中执行回调,方法是将回调中要使用的保留数据传递给它。a 可以传递给 的构造函数,以避免直接扩展 Handler。因此,要通过当前线程的回调来执行一些代码:Message
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()
使用接口实现回调方法的示例。
定义接口 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");
}
}
评论
您也可以用于此目的。这是一个快速指南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);
}
假设 main 函数是触发事件的活动:
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()
}
该类有一个 Type 接口的实例
以及设置其值的方法:Worker
OnCallListener
class Worker() {
lateinit var listener: OnCallListener
fun setOnCallListener(listener: OnCallListener) {
this.listener = listener
}
}
界面如下所示:OnCallListener
interface OnCallListener {
fun onCall()
}
下一个:C++ 中的回调函数
评论