Android'de iOS sınıf NSNotificationCenter'ın bir karşılığı var mı? Benim için herhangi bir kütüphane veya kullanışlı kod var mı?Android'de iOS NSNotificationCenter'a eşdeğer var mı?
cevap
Android'de ios'da olduğu gibi merkezi bir bildirim merkezi yoktur. Ancak görevinizi gerçekleştirmek için temel olarak Observable ve Observer nesnelerini kullanabilirsiniz.
Sen bir şey gibi bir sınıf tanımlayabilirsinizaşağıda, sadece tekil kullanmak üzere değiştirebilir ve eş zamanlı kullanım için senkronize ekleyin ama fikir aynıdır:
public class ObservingService {
HashMap<String, Observable> observables;
public ObservingService() {
observables = new HashMap<String, Observable>();
}
public void addObserver(String notification, Observer observer) {
Observable observable = observables.get(notification);
if (observable==null) {
observable = new Observable();
observables.put(notification, observable);
}
observable.addObserver(observer);
}
public void removeObserver(String notification, Observer observer) {
Observable observable = observables.get(notification);
if (observable!=null) {
observable.deleteObserver(observer);
}
}
public void postNotification(String notification, Object object) {
Observable observable = observables.get(notification);
if (observable!=null) {
observable.setChanged();
observable.notifyObservers(object);
}
}
}
OK kod örneği için teşekkürler :) – user310291
"notifyObservers()" ı çağırmadan önce (veya en azından benim durumumda) "setChanged()" yöntemini çağırmanız gerekir. Bu yüzden benim özel Gözlemlenebilir: http://pastebin.com/hqCuKRzW – jihonrado
Orijinal cevabımı düzenledim @jihonrado, teşekkürler –
Meydanı'na Otto olay otobüse bir göz atın:
http://square.github.com/otto/
o aslında bileşenleri ve olaylar izleyin yollarının bağımlılıkları takip etmek daha kolaydır ek açıklamalar ve statik yazarak aynı NSNotificationCenter gibi özelliklere ancak sayesinde sahiptir. Hisse senedi Android yayın API'sı IMO'dan çok daha basit.
Eğer Observer kullanmak istemiyorsanız - bu bir Parça sen Sen google'ın Guava Kütüphanesi (https://code.google.com/p/guava-libraries/) kullanabilirsiniz daha sonra bir sınıf- uzatamaz nedeni, Gözlemci olmak istiyorum durumlarda sorunlu olabilir "Fonksiyon" ve "Multimap'de" için - Eğer subscibersCollection
yanı HashMap> kullanmak ve böyle bir şey uygulamak rağmen: Behlül cevap dayanarak
import java.util.Collection;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.base.Function;
public class EventService {
ArrayListMultimap<String, Function<Object, Void>> subscibersCollection;
private static EventService instance = null;
private static final Object locker = new Object();
private EventService() {
subscibersCollection = ArrayListMultimap.create();
}
public static EventService getInstance() {
if (instance == null) {
synchronized (locker) {
if (instance == null) {
instance = new EventService();
}
}
}
return instance;
}
/**
* Subscribe to the notification, and provide the callback functions in case
* notification is raised.
*
* @param notification
* - notification name
* @param func
* - function to apply when notification is raised
*/
public void addSubscription(String notification, Function<Object, Void> func) {
synchronized (subscibersCollection) {
if (!subscibersCollection.containsEntry(notification, func)) {
subscibersCollection.put(notification, func);
}
}
}
/**
* Remove subscription from notification
*/
public void removeSubscription(String notification,
Function<Object, Void> func) {
synchronized (subscibersCollection) {
subscibersCollection.remove(notification, func);
}
}
/**
* raise notification for all its subscribers
*
* @param notification
* - notification name
* @param data
* - update data
*/
public void publish(String notification, Object data) {
Collection<Function<Object, Void>> observableList = subscibersCollection
.get(notification);
for (Function<Object, Void> func : observableList) {
func.apply(data);
}
}
}
, yapmam gereken kodunu değiştirmek iOS NSNotificationCenter'a daha yakın.
başka şey: i .. Aynı wondrings vardı bu yüzden yazdım
public class CustomGridViewAdapter extends ArrayAdapter<Category> implements Notifiable {
int layoutResourceId;
public CustomGridViewAdapter(Context context, int layoutResourceId) {
super(context, layoutResourceId);
this.layoutResourceId = layoutResourceId;
loadCategories(false);
NotificationCenter.singelton().addObserver(NotificationID.IMAGES_CACHE_READY, this);
}
public void onDestroy() {
NotificationCenter.singelton().removeObserver(this);
}
@Override
public void onNotification(Notification notify) {
switch (notify.getId()) {
case IMAGES_CACHE_READY:
loadCategories(true);
break;
}
}
...
}
:
public class NotificationCenter {
//static reference for singleton
private static NotificationCenter _instance;
private HashMap<String, ArrayList<Runnable>> registredObjects;
//default c'tor for singleton
private NotificationCenter(){
registredObjects = new HashMap<String, ArrayList<Runnable>>();
}
//returning the reference
public static synchronized NotificationCenter defaultCenter(){
if(_instance == null)
_instance = new NotificationCenter();
return _instance;
}
public synchronized void addFucntionForNotification(String notificationName, Runnable r){
ArrayList<Runnable> list = registredObjects.get(notificationName);
if(list == null) {
list = new ArrayList<Runnable>();
registredObjects.put(notificationName, list);
}
list.add(r);
}
public synchronized void removeFucntionForNotification(String notificationName, Runnable r){
ArrayList<Runnable> list = registredObjects.get(notificationName);
if(list != null) {
list.remove(r);
}
}
public synchronized void postNotification(String notificationName){
ArrayList<Runnable> list = registredObjects.get(notificationName);
if(list != null) {
for(Runnable r: list)
r.run();
}
}
}
bildirimleri ana iş parçacığı üzerinde
package com.oxygen.utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.os.Handler;
public class NotificationCenter {
//---------------- event type list ---------------------
public static enum NotificationID{
IMAGES_CACHE_READY
}
//---------------- singelton ---------------------------
private static NotificationCenter instance = null;
private NotificationCenter() { observables = new HashMap<NotificationID, MyObservable>(); }
public static synchronized NotificationCenter singelton() {
if (instance == null) {
instance = new NotificationCenter();
}
return instance;
}
//-------------------------------------------
public class Notification {
private Object poster; // the object that post the event
private Object info; // event specific data
private NotificationID id; // event name
public Notification(Object poster, NotificationID id, Object info) {
super();
this.poster = poster;
this.info = info;
this.id = id;
}
public Object getPoster() {
return poster;
}
public Object getInfo() {
return info;
}
public NotificationID getId() {
return id;
}
}
//-------------------------------------------
public interface Notifiable {
public void onNotification(Notification notify);
}
//-------------------------------------------
protected class MyObservable {
List<Notifiable> observers = new ArrayList<Notifiable>();
public MyObservable() {
}
public void addObserver(Notifiable observer) {
if (observer == null) {
throw new NullPointerException("observer == null");
}
synchronized (this) {
if (!observers.contains(observer))
observers.add(observer);
}
}
public int countObservers() {
return observers.size();
}
public synchronized void deleteObserver(Notifiable observer) {
observers.remove(observer);
}
public synchronized void deleteObservers() {
observers.clear();
}
public void notifyObservers(Notification notify) {
int size = 0;
Notifiable[] arrays = null;
synchronized (this) {
size = observers.size();
arrays = new Notifiable[size];
observers.toArray(arrays);
}
if (arrays != null) {
for (Notifiable observer : arrays) {
observer.onNotification(notify);
}
}
}
}
//-------------------------------------------
HashMap<NotificationID, MyObservable > observables;
public void addObserver(NotificationID id, Notifiable observer) {
MyObservable observable = observables.get(id);
if (observable==null) {
observable = new MyObservable();
observables.put(id, observable);
}
observable.addObserver(observer);
}
public void removeObserver(NotificationID id, Notifiable observer) {
MyObservable observable = observables.get(id);
if (observable!=null) {
observable.deleteObserver(observer);
}
}
public void removeObserver(Notifiable observer) {
for (MyObservable observable : observables.values()) {
if (observable!=null) {
observable.deleteObserver(observer);
}
}
}
public void postNotification(final Object notificationPoster, final NotificationID id, final Object notificationInfo) {
final MyObservable observable = observables.get(id);
if (observable!=null) {
// notification post to the maim (UI) thread
// Get a handler that can be used to post to the main thread
Handler mainHandler = new Handler(AppContext.get().getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {
observable.notifyObservers(new Notification(notificationPoster, id, notificationInfo));
}
};
mainHandler.post(myRunnable);
}
}
}
Dinleyici örnek ateş edeceği
ve bunun için bir kullanım olacaktır:
, arabirimi mümkün olduğunca IOS'a benzer şekilde yapmaya çalıştı, ancak daha basit (nesne kaydına gerek duyulmadı).
umarım yardımcı olur :)
Çok temiz bir çözüm. – pstoppani
- 1. iOS için 'adb kabuk giriş klavye metnine' eşdeğer var mı?
- 2. İç içe geçmiş işlevler için eşdeğer bir eşdeğer var mı?
- 3. System.Text.StringBuilder bir ikili eşdeğer var mı?
- 4. eşdeğer "verim" excel işlevi var mı?
- 5. Navigator için eşdeğer geçişler var mı?
- 6. Unlisteye() bir S4 eşdeğer var mı?
- 7. C# 7.0 için Microsoft.Net.Compilers eşdeğer var mı?
- 8. Powershell'de "bölünmüş" bir eşdeğer var mı?
- 9. DataContext sınıfına eşdeğer bir LINQPad var mı?
- 10. Android Fragmanlar/Layouts'a eşdeğer iOS
- 11. Android sürümüne eşdeğer iOS sürümü()
- 12. androidde openssl nasıl kurulur
- 13. Uygulama boyutlarını bilirken androidde özel görünümler ekleme
- 14. Android'de XML'deki şekilleri tanımlarken setShadowLayer öğesine bir eşdeğer var mı?
- 15. Mysql'deki Oracle işlevi NVL'ye eşdeğer bir işlev var mı?
- 16. jQuery'de $ (document) .ready (func) öğesine eşdeğer $ (func) var mı?
- 17. Mallaştırılmış bir işaretçi için __attribute __ ((ns_returns_retained)) bir eşdeğer var mı?
- 18. MSTest'in [ClassCleanup] & [ClassInitialize] için statik olmayan eşdeğer var mı?
- 19. GCC'de stdcall için herhangi bir eşdeğer var mı?
- 20. Diğer dillere göre üç eşdeğer R harfi var mı?
- 21. C# içinde F # Seq.windowed için bir eşdeğer var mı?
- 22. Perl's DBI için PHP'nin mysql_real_escape_string() bir eşdeğer var mı?
- 23. Android Yerel Yerleşimleri için DOM denetçisine eşdeğer var mı?
- 24. pydbg modülüne bir Perl eşdeğer modülü var mı?
- 25. ubuntu altında mercurial için git gui bir eşdeğer var mı?
- 26. .NET'de işlem dışı COM EXE için bir eşdeğer var mı?
- 27. XML'de setColorFilter() öğesine eşdeğer bir değer var mı?
- 28. Rust, F # typedefs ile idiomatik bir eşdeğer var mı?
- 29. Vim'in kaydırması için daha az eşdeğer var mı?
- 30. java tr /// (veya eşdeğer) kullanmak için bir yolu var mı?
Bunu mu demek istediniz: NSNotificationCenter veya bildirim gölgesi? – CodaFi
NSNotificationCenter ne bildirim gölgesi olduğunu bilmiyorum :) İhtiyacım Observer Pattern ile birden çok gözlemciye olayları yayınlamaktır. – user310291
[LocalBroadcastRecievers API] (http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html) aradığınız şey gibi görünüyor. – CodaFi