




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 調研項目課題申報書
- ny科研課題申報書
- 個人教研課題申報書
- 售后擔保合同范本
- 關于大米購銷合同范本
- 專線合作合同范本
- 創(chuàng)文宣傳合同范例
- 勞動合同范本軟件
- led貼加工合同范本
- 賣樓鋪面轉讓合同范本
- 2024版《初中物理總復習》課件
- 公安機關人民警察高級執(zhí)法資格考試試卷(附答案)
- 【UCM六輥軋機設計7600字(論文)】
- 滋補品市場洞察報告
- 《積極心理學(第3版)》復習思考題和答案(完整版)劉翔平
- 部編版中考歷史一輪復習:七年級上、下冊歷史復習課件534張
- 江蘇省無錫市惠山區(qū)2024年統(tǒng)編版小升初考試語文試卷(含答案解析)
- 五年級下冊英語作文訓練-外研版(三起)
- 7.2.1 圓柱(課件含動畫演示)-【中職】高一數學(高教版2021基礎模塊下冊)
- 租房協(xié)議書合同范本可下載
- 《義務教育數學課程標準(2022年版)》測試題+答案
評論
0/150
提交評論