【移動應用開發(fā)技術】Android中如何實現觀察者模式_第1頁
【移動應用開發(fā)技術】Android中如何實現觀察者模式_第2頁
【移動應用開發(fā)技術】Android中如何實現觀察者模式_第3頁
【移動應用開發(fā)技術】Android中如何實現觀察者模式_第4頁
【移動應用開發(fā)技術】Android中如何實現觀察者模式_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發(fā)技術】Android中如何實現觀察者模式

概述模式中的角色/upload/information/20200623/125/123036.png觀察者模式示例public

class

MyPerson

extends

Observable

{

private

String

name;

private

int

age;

private

String

sex;

public

String

getName()

{

return

name;

}

public

void

setName(String

name)

{

=

name;

setChanged();

notifyObservers();

}

public

int

getAge()

{

return

age;

}

public

void

setAge(int

age)

{

this.age

=

age;

setChanged();

notifyObservers();

}

public

String

getSex()

{

return

sex;

}

public

void

setSex(String

sex)

{

this.sex

=

sex;

setChanged();

notifyObservers();

}

@Override

public

String

toString()

{

return

"MyPerson

[name="

+

name

+

",

age="

+

age

+

",

sex="

+

sex

+

"]";

}

}public

class

MyObserver

implements

Observer

{

private

int

id;

private

MyPerson

myPerson;

public

MyObserver(int

id)

{

System.out.println("我是觀察者>"

+

id);

this.id

=

id;

}

public

int

getId()

{

return

id;

}

public

void

setId(int

id)

{

this.id

=

id;

}

public

MyPerson

getMyPerson()

{

return

myPerson;

}

public

void

setMyPerson(MyPerson

myPerson)

{

this.myPerson

=

myPerson;

}

@Override

public

void

update(Observable

observable,

Object

data)

{

System.out.println("觀察者>"

+

id

+

"得到更新");

this.myPerson

=

(MyPerson)

observable;

System.out.println(((MyPerson)

observable).toString());

}

}public

class

MainActivity

extends

Activity

{

private

Button

btnAddObserver;

private

Button

btnChangeData;

private

MyPerson

observable;

private

MyObserver

myObserver;

private

List<MyObserver>

myObservers;

private

ListView

listview;

private

int

i;

private

Handler

handler

=

new

Handler()

{

public

void

handleMessage(android.os.Message

msg)

{

MyListAdapter

myListAdapter

=

new

MyListAdapter(MainActivity.this,

myObservers);

listview.setAdapter(myListAdapter);

};

};

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btnAddObserver

=

(Button)

findViewById(R.id.btn_add_observer);

btnChangeData

=

(Button)

findViewById(R.id.btn_change_data);

listview

=

getListView();

observable

=

new

MyPerson();

myObservers

=

new

ArrayList<MyObserver>();

btnAddObserver.setOnClickListener(new

OnClickListener()

{

@Override

public

void

onClick(View

v)

{

myObserver

=

new

MyObserver(i);

i++;

observable.addObserver(myObserver);

myObservers.add(myObserver);

handler.sendEmptyMessage(0);

}

});

btnChangeData.setOnClickListener(new

OnClickListener()

{

@Override

public

void

onClick(View

v)

{

observable.setName("a"

+

i);

observable.setAge(10

+

i);

observable.setSex("男"

+

i);

handler.sendEmptyMessage(0);

}

});

}

@Override

protected

void

onDestroy()

{

//

TODO

Auto-generated

method

stub

super.onDestroy();

observable.deleteObserver(myObserver);

}

}Android源碼中的模式實現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);

}

/**

*

Notifies

the

attached

observers

that

the

underlying

data

has

been

changed

*

and

any

View

reflecting

the

data

set

should

refresh

itself.

*

當數據集用變化時通知所有觀察者

*/

public

void

notifyDataSetChanged()

{

mDataSetObservable.notifyChanged();

}

}public

class

DataSetObservable

extends

Observable<DataSetObserver>

{

/**

*

Invokes

onChanged

on

each

observer.

Called

when

the

data

set

being

observed

has

*

changed,

and

which

when

read

contains

the

new

state

of

the

data.

*/

public

void

notifyChanged()

{

synchronized(mObservers)

{

//

調用所有觀察者的onChanged方式

for

(int

i

=

mObservers.size()

-

1;

i

>=

0;

i--)

{

mObservers.get(i).onChanged();

}

}

}

}

@Override

public

void

setAdapter(ListAdapter

adapter)

{

//

如果已經有了一個adapter,那么先注銷該Adapter對應的觀察者

if

(mAdapter

!=

null

&&

mDataSetObserver

!=

null)

{

mAdapter.unregisterDataSetObserver(mDataSetObserver);

}

//

代碼省略

super.setAdapter(adapter);

if

(mAdapter

!=

null)

{

mAreAllItemsSelectable

=

mAdapter.areAllItemsEnabled();

mOldItemCount

=

mItemCount;

//

獲取數據的數量

mItemCount

=

mAdapter.getCount();

checkFocus();

//

注意這里

:

創(chuàng)建一個一個數據集觀察者

mDataSetObserver

=

new

AdapterDataSetObserver();

//

將這個觀察者注冊到Adapter中,實際上是注冊到DataSetObservable中

mAdapter.registerDataSetObserver(mDataSetObserver);

//

代碼省略

}

else

{

//

代碼省略

}

requestLayout();

}

class

AdapterDataSetObserver

extends

AdapterView<ListAdapter>.AdapterDataSetObserver

{

@Override

public

void

onChanged()

{

super.onChanged();

if

(mFastScroll

!=

null)

{

mFastScroll.onSectionsChanged();

}

}

@Override

public

void

onInvalidated()

{

super.onInvalidated();

if

(mFastScroll

!=

null)

{

mFastScroll.onSectionsChanged();

}

}

}class

AdapterDataSetObserver

extends

DataSetObserver

{

private

Parcelable

mInstanceState

=

null;

//

調用Adapter的notifyDataSetChanged的時候會調用所有觀察者的onChanged方法,核心實現就在這里

@Override

public

void

onChanged()

{

mDataChanged

=

true;

mOldItemCount

=

mItemCount;

//

獲取Adapter中數據的數量

mIt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論