Android迴圈新增多個控制元件
阿新 • • 發佈:2019-02-18
在Android開發中,我們有時候會在一個容器(例如:LinearLayout)中新增多個子控制元件,由於對控制元件的操作必須在主執行緒中,因此過多的佔用主執行緒,勢必會使程式終止退出。
在下面的例子中,我們在一個LinearLayout容器中迴圈新增500個子控制元件(TextView),
private final int CONTROLS_COUNT = 500;
private void initWidget(){
for (int i = 0; i < CONTROLS_COUNT; i++) {
container_linear.addView(createTextView("text " +i));
}
}
程式啟動後,整個Activity會有短暫的空白頁面,原因是迴圈新增TextView,在控制元件未完全載入完成,是不會顯示activity頁面的。
可解決的方法是,逐步新增多個子控制元件,通過View.post(Runnable)方法將新增子控制元件的操作交由Handle,由Handle分發到主執行緒來執行。
private int mCurAddControlIndex=0;
private final int ADD_COUNT_ONCE=4;
private void initWidget2(){
Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (mCurAddControlIndex+ADD_COUNT_ONCE<CONTROLS_COUNT) {
addSomeControls(ADD_COUNT_ONCE);
container_linear.post(this);
}else {
addSomeControls(CONTROLS_COUNT-mCurAddControlIndex);
}
mCurAddControlIndex +=ADD_COUNT_ONCE;
}
};
container_linear.post(runnable);
}
private void addSomeControls(int count){
for (int i = 0; i < count; i++) {
container_linear.addView(createTextView("text "+(mCurAddControlIndex+i)));
}
}
如此操作,只要開啟Activity頁面,就能立刻看到Activity上控制元件,不會再用短暫的卡現象了。
View.post(Runnable)基本原理:
在post(Runnable action)方法裡,View獲得當前執行緒(即UI執行緒)的Handler,然後將action物件post到Handler裡。在Handler裡,它將傳遞過來的action物件包裝成一個Message(Message的callback為action),然後將其投入UI執行緒的訊息迴圈中。