2012-06-06 21 views
6

Java için oldukça yeni amaJava'da geri çağırmalarla işlev çağırma nasıl C# içinde yapmak gibi?

private void ParentFunc() 
{ 
    var worker = new WorkerClass() 

    worker.DoWork(e => console.Write("Progress" + e)); 


} 

public class WorkerClass() 
{ 
    public method DoWork(Action<int> callback) 
    { 
     for (int i=1; i<1000; i++) callback.Invoke(i); 
    } 
} 

Küçük açıklama (Ne gerekliyse göstermek için bu el daktilo prototip) bu C# kodu gibi şeyler yazmak gerekir. Ben android içinde AsyncTask kullanıyorum ve dış işlemci sınıflandırılmış çağırıyorlar ama geri bildirim yapmak istiyorum böylece publishProgress yapabilirsiniz. Ben yağmurluk sözdizimi kadar onları oldukça ayrıntılı bulmak çünkü anonim sınıfları kullanmanızı önermek için gitmiyorum

interface CallBack<P> 
{ 
    public void callback(P p); 
} 

class MyCallBack implements CallBack<String> { 
    public void callBack(String p) { 
    System.out.println(p); 
    } 
} 

class WorkerClass { 
    public void doWork(CallBack<String> callback) 
    { 
    // do work 
    callback.callBack("Done!"); 
    } 
} 

WorkerClass wc = new WorkerClass(); 
wc.doWork(new MyCallBack()); 

: Ben bir destek sınıfı yardımıyla benim AsyncTask

+3

Wai java 8 için t :) – Torious

+2

[Java Geri çağırma işlevleri] olası bir kopyası (http://stackoverflow.com/questions/443708/callback-functions-in-java) – assylias

cevap

6

beri arayüzü ve anonim iç sınıf kullanmak zorunda.

private void ParentFunc { 
    WorkerClass worker = new WorkerClass(); 

    worker.doWork(new Callback<Integer>() { 
     public void invoke(Integer arg) { 
      System.out.println("Progress" + arg); 
     } 
    }); 
} 

public class WorkerClass { 
    public doWork(Callback<Integer> callback) { 
     for (int i=1; i<1000; i++) callback.invoke(i); 
    } 
} 

public interface Callback<T> { 
    public void invoke(T arg); 
} 
4

üzerinde arayüz koymak tercih mevcut olmayacak ama sadece kişisel bir zevk meselesi, ben onları kullanırken parantez arasında kendi kendini kaybetme biter ..

5

Java'da, arayüzleri uygulayan anonim sınıflar kullanırsınız. Bu biraz daha ayrıntılı, ama gayet güzel çalışıyor: kapanışları henüz desteklenmemektedir

interface MyAction { 
    void doit(String str); 
} 

class WorkerClass { 
    void doWork(MyAction action); 
} 

void main(String args[]) { 
    WorkerClass worker = new WorkerClass(); 
    worker.doWork(new MyAction { 
     public void doit(String e) { 
      System.out.println("Progress" + e) 
     } 
    }); 
} 
+0

var? Bu Java mı yoksa C# mi? –

+0

@ Eng.Fouad Oops, C# 'da çok uzun süre kodlama yapıyorum :) Teşekkürler! – dasblinkenlight

0

yinelenen soruya cevabım bakın java 8 ile mümkündür:

https://stackoverflow.com/a/26776520/1206998

argüman olarak bir işlevi kullanın:

import java.util.function.Function; 

public String applyFunction(Function<String,String> function){ 
     return function.apply("what ever"); 
} 

Çağrı

// with someObject.someMethod(String) => String 
xxx.applyFunction(someObject::someMethod); 
İlgili konular