Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中使用Handler機制更新UI的三種解決方案

Android中使用Handler機制更新UI的三種解決方案

編輯:關於Android編程

最近想把學習Android過程中的Handler使用經驗寫下來,供自己以後查看,也與大家一起分享。

使用Handler其實不得不與Android中的線程或者說Java中的多線程扯上關系。本篇文章只會用到最基本的線程使用,不會涉及太難的,關於Android的線程我們以後再討論。在Android中每新建一個Activity,該Activity(理解為界面)就是一個線程,是一個主線程,也稱之為UI線程。主線程可以更新界面元素,不會出現問題。每當新建一個線程new Thread,該線程就是一個子線程,Android規定子線程是不能直接更新UI界面的,否則會出問題。

下面將會使用Android提供的Handler機制在子線程中更新UI.分別使用3種方式,3種方式相互聯系又有區別。

(1)Handler.post()方式

該方法使用Handler中的post()方法更新UI,這裡會涉及Thread,Runnable兩個線程的概念,先暫且忽略吧。該方法比較簡單,容易理解。先貼上代碼:

 

public class MainActivity extends Activity {

    private TextView text;
    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.id_text);

        /**
         * new Thread()在該線程中實現你具體的業務邏輯,比如網絡請求,耗時操作等等;
         * new Thread()是一個子線程,是非UI線程,如果在該線程中需要更新界面,則需要使用Handler;
         *
         */
        new Thread() {
            @Override
            public void run() {//在run()方法實現業務邏輯;
                //...

                //更新UI操作;
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        text.setText(使用Handler更新了界面);
                    }
                });

            }
        }.start();
    }
}

注意看其中的注釋。開發者的對線程的業務邏輯操作寫在Thread.run()方法中,更新UI的操作寫到Runnable.run()方法中。實現效果如下:

 

\

 

(2)Handler.post(),內部類實現Runnable接口方式

該方法與方法1非常像,只是新建了一個內部類,並且實現了Runnable接口,然後在post()方法中不用new一個匿名內部類了。相對來說邏輯上更加清楚。思路同方法1.貼上代碼如下:

 

public class MainActivity extends Activity {

    private TextView text;
    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.id_text);
        final MyRunnable myRunnable = new MyRunnable();//定義MyRunnable的對象;

        new Thread() {

            @Override
            public void run() {
                handler.post(myRunnable);//調用Handler.post方法;
            }
        }.start();
    }

    class MyRunnable implements Runnable {//內部類實現Runnable接口;

        @Override
        public void run() {//還是在Runnable重寫的run()方法中更新界面;
            text.setText(使用Handler更新了界面);
        }
    }
}

注意提醒一點:Thread必須調用start()方法,否則線程不會被執行。實現效果如下:

 

\

 

(3)sendMessage(),handleMessage()方式

在Handler中有兩個非常重要的方法,sendMessage()和handleMessage()方法,sendMessage()方法用於在線程中向Handler發送一個消息,handleMessage()用於捕獲該消息,並且更新UI.代碼如下:

 

public class MainActivity extends Activity {

    private TextView text;
    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    text.setText(使用Handler更新了界面);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.id_text);

        new Thread() {

            @Override
            public void run() {
                //...你的業務邏輯;
                Message message = new Message();//發送一個消息,該消息用於在handleMessage中區分是誰發過來的消息;
                message.what = 1;
                handler.sendMessage(message);
            }
        }.start();
    }
}

實現效果同上述兩個方法:

 

\

 

至此,已經基本實現了在子線程中使用Handler更新了UI界面。能滿足最基本的開發需要。當然Handler中還有很多細節以及注意事項,請聽下回分解。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved