Android UI线程分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
理解UI线程——swt, Android, 和Swing的UI机理
线程
在做GUI的时候, 无论是SWT, AWT, Swing 还是Android, 都需要面对UI线程的问题, UI线程往往会被单独的提出来单独对待, 试着问自己,
当GUI启动的时候, 后台会运行几个线程? 比如
1. SWT 从Main函数启动
2. Swing 从Main函数启动
3. Android 界面启动
常常我们被告知, 主线程, UI线程, 因此这里很多会回答, 有两个线程, 一个线程是Main, 另外一个是UI. 如果答案是这样, 这篇文章就是写给你的。
OK, 我们以SWT为例, 设计以下方案寻找答案, 第一步, 我们看能否找到两个线程:
1. 从Main中启动SWT的界面, 在启动界面前, 将Main所在的线程打印出来这里设计为Shell中嵌入一个Button
2. 点击Button, 运行一个耗时很长的操作, 反复修改Button的文字, 在该线程中打印该线程的名称
代码是这样的:
1.public
static
void main(String[] args) {
2.final Display display = Display.getDefault();
3.final Shell shell = new Shell();
4. shell.setSize(500, 375);
5. shell.setText("SWT Application");
6. shell.setLayout(new FillLayout());
7. btn = new Button(shell, SWT.NULL);
8. btn.setText("shit");
9. registerAction();
10. shell.open();
11. yout();
12.while (!shell.isDisposed()) {
13.if (!display.readAndDispatch())
14. display.sleep();
15. }
16. shell.dispose();
17. display.dispose();
18.}
19.private
static
void registerAction() {
20. btn.addMouseListener(new MouseListener() {
21. @Override
22.public
void mouseDoubleClick(MouseEvent e) {
23. // TODO Auto-generated method stub
24. }
25. @Override
26.public
void mouseDown(MouseEvent e) {
27. methodA();
28. }
29. @Override
30.public
void mouseUp(MouseEvent e) {
31. }
32. });
33.}
34./**
35.* 持续的跑动, 打印线程的名称, 注意拖拽不动, 界面死掉, 直到跑完
36.*/
37.private
static
void methodA() {
38.for (int i = 0; i < count; i++) {
39. haveArest(300);
40. System.out.println("MethodA:" +
Thread.currentThread().getName());
41. btn.setText(i + "");
42. }
43.}
haveArest方法在最后出现, 只是封装了一个让线程等待一段时间, 打印的结果都为main, 于是得到第一个重要的结论:
UI所在的线程和Main所在的线程都是同一个线程。
再来推断一把:
UI在哪个线程启动的, 则这个线程就是UI线程.
1./**
2.* @param args
3.*/
4.public
static
void main(String[] args) {
5. // TODO Auto-generated method stub
6.
7. Thread t = new Thread(new Runnable() {
8. @Override
9.public
void run() {
10. createUI();
11. }
12. });
13. t.start();
14.}
15.
16.private
static
void createUI()
17.{
18. System.out.println(Thread.currentThread().getName());
19.final Display display = Display.getDefault();
20.final Shell shell = new Shell();
21. shell.setSize(500, 375);
22. shell.setText("SWT Application");
23. shell.setLayout(new FillLayout());
24. Button btn = new Button(shell, SWT.NULL);
25. btn.setText("shit");
26. shell.open();
27. yout();
28.while (!shell.isDisposed()) {
29.if (!display.readAndDispatch())
30. display.sleep();
31. }
32. shell.dispose();
33. display.dispose();
34.}
通过打印结果发现, 推论是正确的.
根据铺天盖地参考书提示, 有这样一条定律: