Android開發之多線程環境下更新介面

來源:互聯網
上載者:User

Android應用程式的介面運行於獨立的線程裡。但有時候軟體需要單獨的線程來處理資料,然後再更新介面。這樣能夠保證介面啟動並執行流暢又不至於影響使用者體驗。這裡的問題在於,UI只能被介面線程更新,在多線程環境下回出錯。本文會展示這種典型的錯誤,以及解決方案。

下面以計時器為例。在這個應用情境中,計時是在另一個線程裡面完成的,然後再由UI顯示出來。

多線程更新介面的常見問題

下面這段代碼使用了一個Timer線程來嘗試更新UI,應用會意外終止。

        final TextView dashboard = (TextView) findViewById(R.id.dashboard);                stopwatch = new Stopwatch();                dashboard.setText(stopwatch.toString());                timer = new Timer("timer", true);        timer.schedule(new TimerTask() {@Overridepublic void run() {stopwatch.next();dashboard.setText(stopwatch.toString());}}, 1000, 1000);

查看LogCat會發現如下資訊:

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

這是因為android中,只有UI線程才能更新使用者介面,其他線程要更新介面只能通過發送訊息來實現。

UI訊息佇列

與經典的MFC類似,Android的UI架構也是基於訊息佇列的。使用者的點擊、動作等等,甚至後台對介面的更新都是通過發送訊息來實現的。

以點擊事件為例,該事件會被UI架構加入到訊息佇列中。而UI線程則會依次從隊列中取出訊息,根據訊息的類型、內容,在UI介面樹中依次傳送。目標控制項會相應該事件,從而完成介面的繪製和更新。

發送訊息

要從別的線程向UI線程發送訊息,執行動作,需要使用到android.os.Handler這個類。如果你線上程A中聲明了Hanlder的一個執行個體,線程B就可以使用這個執行個體向線程A的訊息佇列發送訊息。下面將使用Handler類的postAtFrontOfQueue(Runnable)方法來實現計時程式。

        timer = new Timer("timer", true);        timer.schedule(new TimerTask() {@Overridepublic void run() {stopwatch.next();handler.postAtFrontOfQueue(new Runnable() {public void run() {dashboard.setText(stopwatch.toString());}});}}, 1000, 1000);

Handler執行個體會在UI線程中執行給定的Runnable執行個體,完成更新時間的動作。

這篇文章是我在寫X-Points的時候遇到的一個具體問題,寫在這裡總結一下。

有用的資料

UI環境下的多線程

深入理解Android訊息佇列原理篇

Android的Looper類

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.