我刚刚从iPhone切换到Android,我正在寻找类似于iPhone SDK中的内容,当一个类完成某个任务时,它会调用设置为委托的对象中的委托方法。
我不需要太多细节。我浏览了文档但没有找到任何内容(我得到的最接近的是“广播意图”,看起来更像iOS通知)。
即使有人能指出我正确的文档,也会很棒。
谢谢!
答案 0 :(得分:16)
没关系......在这里找到答案:)
http://www.javaworld.com/javaworld/javatips/jw-javatip10.html
从文章中粘贴以保留它:
熟悉MS-Windows和X Window系统的事件驱动编程模型的开发人员习惯于在发生某些事情时传递被调用的函数指针(即“回调”)。 Java的面向对象模型目前不支持方法指针,因此似乎排除了使用这种舒适的机制。但一切都没有丢失!
Java对接口的支持提供了一种机制,通过它我们可以获得相当于的回调。诀窍是定义一个简单的接口,声明我们希望调用的方法。
例如,假设我们希望在事件发生时得到通知。我们可以定义一个接口:
public interface InterestingEvent
{
// This is just a regular method so it can return something or
// take arguments if you like.
public void interestingEvent ();
}
这使我们能够抓住实现该接口的类的任何对象。因此,我们不需要关心任何其他类型的信息。这比使用Motif使用C ++代码时使用小部件的数据字段来保存对象指针的黑客蹦床C函数要好得多。
指示事件的类需要期望实现 InterestingEvent 接口的对象,然后根据需要调用 interestingEvent()方法。
public class EventNotifier
{
private InterestingEvent ie;
private boolean somethingHappened;
public EventNotifier (InterestingEvent event)
{
// Save the event object for later use.
ie = event;
// Nothing to report yet.
somethingHappened = false;
}
//...
public void doWork ()
{
// Check the predicate, which is set elsewhere.
if (somethingHappened)
{
// Signal the even by invoking the interface's method.
ie.interestingEvent ();
}
//...
}
// ...
}
在该示例中,我使用 somethingHappened 谓词来跟踪是否应该触发事件。在许多情况下,调用该方法的事实足以保证发出 interestingEvent()的信号。
希望接收事件通知的代码必须实现 InterestingEvent 接口,并将对自身的引用传递给事件通知程序。
public class CallMe implements InterestingEvent
{
private EventNotifier en;
public CallMe ()
{
// Create the event notifier and pass ourself to it.
en = new EventNotifier (this);
}
// Define the actual handler for the event.
public void interestingEvent ()
{
// Wow! Something really interesting must have occurred!
// Do something...
}
//...
}
这就是它的全部。我希望使用这个简单的Java习惯用法可以让你对Java的过渡更加紧张。
答案 1 :(得分:4)
this video tutorial的主要内容是展示如何使用接口来委派不同片段和活动之间的方法/数据交换,但这是学习如何在Java for Android中实现委托模式的很好的例子。
答案 2 :(得分:2)
kotlin的吊坠。
定义您的界面:在我的示例中,我使用外部库扫描信用卡。
interface ScanIOInterface {
fun onScannedCreditCard(creditCard: CreditCard)
}
创建一个可以注册Activity
/ Fragment
的课程。
class ScanIOScanner {
var scannerInterface: ScanIOInterface? = null
fun startScanningCreditCard() {
val creditCard = Library.whichScanCreditCard() //returns CreditCard model
scannerInterface?.onScannedCreditCard(creditCard)
}
}
在您的Activity
/ Fragment
中实现界面。
class YourClassActivity extends AppCompatActivity, ScanIOInterface {
//called when credit card was scanned
override fun onScannedCreditCard(creditCard: CreditCard) {
//do stuff with the credit card information
}
//call scanIOScanner to register your interface
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val scanIOScanner = ScanIOScanner()
scanIOScanner.scannerInterface = this
}
}
CreditCard
是一个模型,可以根据需要定义。就我而言,它包括品牌,数字,有效期...
之后,您可以随时拨打scanIOScanner.startScanningCreditCard()
。
答案 3 :(得分:1)
Java回调与ios委托不同,在ios中你可以像在Android中一样使用回调。在Android中,startActivityForResult
可以帮助您实现ios委托的使用任务。
答案 4 :(得分:1)
我相信ListAdapter
是Android中委托模式的一个示例。
答案 5 :(得分:0)
Kotlin 的官方委托模式:
interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
class Derived(b: Base) : Base by b
fun main() {
val b = BaseImpl(10)
Derived(b).print()
}