深入Android架构(从线程到AIDL)_08 认识Android的主线程

目录

[3、 认识Android的主线程(又称UI线程)](#3、 认识Android的主线程(又称UI线程))

[复习: 各进程(Process)里的主线程​编辑](#复习: 各进程(Process)里的主线程编辑)

[UI线程的责任: 迅速处理UI事件](#UI线程的责任: 迅速处理UI事件)

举例


3、 认识Android的主线程(又称UI线程)

复习: 各进程(Process)里的主线程
UI线程的责任: 迅速处理UI事件
  • 在Android里,关照UI画面的事件(Event)是UI线程的重要职责,而且是它的专属职责,其它子线程并不可以插手存取UI画面上的对象(如TextView)呢!
  • 由于Android希望UI线程能够给予用户的要求做快速的反应。如果UI 线程花费太多时间做幕后的事情,而在UI事件发生之后,让用户等待超过5秒钟而未处理的话,Android就会向用户道歉。
java 复制代码
// ac01.java
// ........
public class ac01 extends Activity implements OnClickListener {
    public TextView tv;
    private Button btn, btn2, btn3;
    
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        btn = new Button(this); btn.setId(101);
        btn.setBackgroundResource(R.drawable.heart);
        btn.setText("Block UI thread"); btn.setOnClickListener(this);
        LinearLayout.LayoutParams param =
            new LinearLayout.LayoutParams(150,50);
        param.topMargin = 10;
        layout.addView(btn, param);

        btn2 = new Button(this); btn2.setId(102);
        btn2.setBackgroundResource(R.drawable.heart);
        btn2.setText("Show"); btn2.setOnClickListener(this);
        layout.addView(btn2, param);
        btn3 = new Button(this); btn3.setId(103);
        btn3.setBackgroundResource(R.drawable.heart);
        btn3.setText("Exit"); btn3.setOnClickListener(this);
        layout.addView(btn3, param);
        tv = new TextView(this);
        tv.setTextColor(Color.WHITE); tv.setText("");
        LinearLayout.LayoutParams param2 =
            new LinearLayout.LayoutParams(150, 60);
        param2.topMargin = 10;
        layout.addView(tv, param2);
        setContentView(layout);

        //------------------------------
        setTitle("please press <Block...> & <Show> ");
        tv.setText("then wait for 5 min...");
    }

    public void onClick(View v) {
        switch(v.getId()){
            case 101:
                try { Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                break;
            case 102: break;
            case 103: finish(); break;
        }
    }
}
  • 此程式執行時,畫面上先出現:
  • 連續按下<Block UI thread>和<Show>按鈕,然後等待5秒鐘,就會出現剛才所說的道歉提示,如下圖:
举例
  • 如果想要一边秀动画,一边播音乐时,使用单一线程来控制一边秀动画,一边播音乐,如下图所示;又会如何呢?
  • 主线程可以诞生多个子线程来分担其工作,尤其是比较冗长费时的幕后服务工作,例如播放动画的背景音乐、或从网络下载影片等。于是,主线程就能专心于处理UI画面的事件了。
  • 再如,当你开发一个游戏程序时,如果你希望游戏循环不受UI事件的干扰,或希望游戏循环(GameLoop)不要阻塞住UI线程的话,就不适合拿UI线程去跑游戏循环了。
相关推荐
悲凉的紫菜7 小时前
dariy
android·ide·android studio
2501_915909067 小时前
IPA 深度混淆是什么意思?从混淆强度到实际效果的解读
android·ios·小程序·https·uni-app·iphone·webview
LT10157974448 小时前
2026年手机机型兼容性测试选型指南:安卓机型碎片化、APP闪退UI错乱如何解决
android·测试工具·ui·智能手机
阿pin9 小时前
Android随笔-view是如何显示到屏幕上
android·view
恋猫de小郭9 小时前
Flutter material/cupertino 解耦最新进展,已经在做新样式了
android·前端·flutter
在书中成长9 小时前
HarmonyOS 小游戏《对战五子棋》开发第17篇 - AI的两种评估策略
android·java·javascript
私人珍藏库10 小时前
[Android] Npatch-免Root框架+可内置模块
android·人工智能·智能手机·工具·软件
黄林晴10 小时前
KMP 正式支持 SwiftPM:CocoaPods 迁移配置指南
android·ios·kotlin
AFinalStone10 小时前
Android 7系统网络(二)内核层—netfilter_iptables与路由策略
android·网络
吠品10 小时前
Mac定时关机、开机自动化:用shutdown和pmset就够了
android·java·开发语言