Heim  >  Artikel  >  Java  >  Codeanalyse der Muster Android Adapter (Adapter) und Observer (Observer) (Bild)

Codeanalyse der Muster Android Adapter (Adapter) und Observer (Observer) (Bild)

黄舟
黄舟Original
2017-03-11 11:51:023008Durchsuche

Details zum Adapter: http://www.php.cn/java-article-355851.html

Details zum Observer: http://www.php.cn /java-article-356024. html

AdapterView-System


AdapterView verwendet Adapter

Adaptersystem


BaseAdapter implementiert SpinnerAdapter, ListAdapter

Dieses Formular ist die Anwendung des Adaptermusters, das hier verwendet wird Ja Schnittstellenadapter

Observer-Modus

Methoden zum Registrieren und Aufheben der Registrierung von DataSetObserver sind im Adapter definiert

public interface Adapter {
  
    void registerDataSetObserver(DataSetObserver observer);

    void unregisterDataSetObserver(DataSetObserver observer);

    ...
}
public abstract class DataSetObserver {

    public void onChanged() {
        // Do nothing
    }

    public void onInvalidated() {
        // Do nothing
    }
}
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
    private final DataSetObservable mDataSetObservable = new DataSetObservable();

    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }

    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }

    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }

    public void notifyDataSetInvalidated() {
        mDataSetObservable.notifyInvalidated();
    }
    ...
}
public class DataSetObservable extends Observable<DataSetObserver> {

    public void notifyChanged() {
        synchronized(mObservers) {
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onChanged();
            }
        }
    }

    public void notifyInvalidated() {
        synchronized (mObservers) {
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onInvalidated();
            }
        }
    }
}
public abstract class Observable<T> {

    protected final ArrayList<T> mObservers = new ArrayList<T>();

    public void registerObserver(T observer) {
        if (observer == null) {
            throw new IllegalArgumentException("The observer is null.");
        }
        synchronized(mObservers) {
            if (mObservers.contains(observer)) {
                throw new IllegalStateException("Observer " + observer + " is already registered.");
            }
            mObservers.add(observer);
        }
    }

    public void unregisterObserver(T observer) {
        if (observer == null) {
            throw new IllegalArgumentException("The observer is null.");
        }
        synchronized(mObservers) {
            int index = mObservers.indexOf(observer);
            if (index == -1) {
                throw new IllegalStateException("Observer " + observer + " was not registered.");
            }
            mObservers.remove(index);
        }
    }

    public void unregisterAll() {
        synchronized(mObservers) {
            mObservers.clear();
        }
    }
}

DataSetObserver Observer (Beobachtungsdatensatz: geändert bei Changed, ungültig bei Invalidated)

Observable verwaltet den Beobachter (Hinzufügen, Entfernen, Registrieren, Abmelden)

DataSetObservable erweitert Observable4864d1769940fac3918b0cc0f2557122 Zwei Methoden zur Benachrichtigung von Datenänderungen und Ungültigkeit hinzugefügt

In AdapterView passt

class AdapterDataSetObserver extends DataSetObserver {

        private Parcelable mInstanceState = null;

        @Override
        public void onChanged() {
            mDataChanged = true;
            mOldItemCount = mItemCount;
            mItemCount = getAdapter().getCount();

            // Detect the case where a cursor that was previously invalidated has
            // been repopulated with new data.
            if (AdapterView.this.getAdapter().hasStableIds() && mInstanceState != null
                    && mOldItemCount == 0 && mItemCount > 0) {
                AdapterView.this.onRestoreInstanceState(mInstanceState);
                mInstanceState = null;
            } else {
                rememberSyncState();
            }
            checkFocus();
            requestLayout();
        }

        @Override
        public void onInvalidated() {
            mDataChanged = true;

            if (AdapterView.this.getAdapter().hasStableIds()) {
                // Remember the current state for the case where our hosting activity is being
                // stopped and later restarted
                mInstanceState = AdapterView.this.onSaveInstanceState();
            }

            // Data is invalid so we should reset our state
            mOldItemCount = mItemCount;
            mItemCount = 0;
            mSelectedPosition = INVALID_POSITION;
            mSelectedRowId = INVALID_ROW_ID;
            mNextSelectedPosition = INVALID_POSITION;
            mNextSelectedRowId = INVALID_ROW_ID;
            mNeedSync = false;

            checkFocus();
            requestLayout();
        }

        public void clearSavedState() {
            mInstanceState = null;
        }
    }

den AdapterDataSetObserver an und ruft requestLayout() auf. in beiden Implementierungsmethoden und setzt das Layout zurück

Die gesamten Beobachtungsdaten ändern sich, was zum Schnittstellenänderungsprozess führt:
1. Passen Sie AdapterDataSetObserver im AdapterView-System an und registrieren Sie es (d. h. fügen Sie Beobachter zu Observable hinzu).

2. Nach dem Aufruf von adapter.notifyDataSetChanged() wird notifyChanged() des Observables intern ausgeführt,

führt onChanged jedes Beobachters aus () erzielt auch den Effekt einer Aktualisierung der Schnittstelle.

notifyDataSetInvalidated ist dasselbe wie

Das obige ist der detaillierte Inhalt vonCodeanalyse der Muster Android Adapter (Adapter) und Observer (Observer) (Bild). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn