2012-04-03 11 views
5

Şu anda bir android uygulamasının sunum katmanını geliştiriyorum.java zincir asenkronize çağrılara en şık çözüm?

Ben Tipler böyle bir şey kullanıyorum api:

public interface errorInterface{ 
    public void onError(String reason); 
} 

public interface if1 extends errorInterface{ 
    public void dataReceived1(Data data); 
} 
public interface if2 extends errorInterface{ 
    public void dataReceived2(Data data); 
} 

public void fetchData1(if1 receiver) {} 
public void fetchData2(if2 receiver) {} 

olduğu; Verileri almak için, gelecekte operasyonun sonucunu alacağınız bir alıcı sağlıyorsunuz.

Her seferinde yalnızca bir yöntemi çağırmanız gerektiğinde çok iyi çalışır, ancak şimdi bir seferde 10'dan fazla yöntemi çağırmam gerektiğinde bu noktaya ulaştım ve her seferinde bir tane yürütmeleri gerekiyor.

Bunu esnek ve zarif bir şekilde nasıl çözebilirim?

Teşekkürler!

cevap

7

beni anlıyorum emin olalım bkz tarihinde Guava Kütüphane kullanabilirsiniz Alınan. public void dataReceived(Data d) ve public void onError(String reason): Herşeyden

Birincisi, vb if1, if2, sizin iki temel yöntemlerle hepsi aynı arayüz vardı iyi olabilirlerdi. Bununla birlikte, alıcılarınızın bir List veya Collection'unu fetchData'a geçirebilir ve koleksiyon üzerinde yineleyebilir ve her birinde dataReceived(d)'u arayabilirsiniz.

Eğer herhangi bir sebepten ötürü işe yaramazsa, fetchData için benzer bir arabirime sokmak için bir adaptör kullanmayı deneyeceğim. Örneğin: bir yerde bununla Şimdi

public interface DataReceiver extends ErrorInterface { 
    public void dataReceived(Data d); 
    //or just scrap the ErrorInterface all together and make these into 1 interface 
} 

public class AbstractIFAdapter<T extends ErrorInterface> implements DataReceiver { 
    private T target; 
    public AbstractIFAdapter(T target) { this.target = target); 
    public void onError(String reason) { target.onError(reason); } 
    protected T getTarget() { return target; } 
} 

public class IF1Adapter extends AbstractIFAdapter<IF1> { 
    public IF1Adapter(IF1 target) { super(target); } 
    public dataReceived(Data d) { getTarget().dataReceived1(d); } 
} 

public class IF2Adapter extends AbstractIFAdapter<IF2> { 
    public IF2Adapter(IF2 target) { super(target); } 
    public dataReceived(Data d) { getTarget().dataReceived2(d); } 
} 

, biz böyle bir şey yapabilirsiniz:

böyle ziyaretçiler ya da belki bir zincir olarak tam ihtiyaçlarına bağlı olarak geçerli olabilecek diğer desenler vardır
List<DataReceiver> dataReceivers = new ArrayList<DataReceiver>(); 
dataReceivers.add(new IF1Adapter(someIf1Implementation)); 
dataReceivers.add(new IF2Adapter(someIf2Implementation)); 
fetchData(dataReceivers); 

public void fetchData(Collection<DataReceiver> receivers) { 

    try { 
    Data d = getSomeData(); 
    for (DataReceiver dr : receivers) { 
     dr.dataReceived(d); 
    } 
    } 
    catch (Exception e) { 
    for (DataReceiver dr : receivers) { 
     dr.onError(e.getMessage()); 
    } 
    } 
} 

-de-sorumluluk türü desen alıcılar zincirleme bir liste türü yapı içinde birbirine zincirleme ve her biri bir yinelemeli yapı içinde sonraki çağırır - bu fetchData bir koleksiyon almak olduğunu bilmeniz gerekmez, sadece alır zincirdeki üst bağdaştırıcısına bir başvuru. Yani, AbstractIFAdapter başka bir AbstractIFAdapter referansına sahip olur, hadi next diyelim, ve eğer referans null değilse, kendi dataReceived yöntemini çağırır. Her filtre ServletRequest alır ve chain.doFilter(request,response) çağrıları ServletFilter s gibi benzer bir fikir.

+0

Çok yardımcı yanıt. İhtiyaçlarım için değiştirilen ilk önerinizin bir sürümü ile sona erdi! – monoceres

1

Sen arayüzleri if1, if2 .. ifn bir dizi var ve bunları tüm verileri işlemek isterler .., this answer

+0

Bu projede böyle bir ağır kütüphane kullanmamayı tercih ederim. – monoceres

İlgili konular