1. 程式人生 > >Android迴圈新增多個控制元件

Android迴圈新增多個控制元件

在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執行緒的訊息迴圈中。