Android线程——Mars Android开发视频之第二季第五集(重)

本文深入探讨了Java线程的概念及其在Android应用中的应用,详细讲解了线程的两种实现方式(继承Thread类与实现Runnable接口),多线程同步机制,以及主线程(MainThread)与工作线程(WorkerThread)的区别与使用场景。通过实验演示了工作线程无法操作UI,着重介绍了如何避免ANR问题,并展示了在工作线程中执行可能引发阻塞操作的实例。

1.回顾JAVA中的线程

  • 线程的两种实现方式

1 继承Thread类

2 实现Runnable接口

两者区别:

  • 前者代表一个线程

  • 后者代表线程体,也就是线程要执行的代码。

  • 多线程同步

多个线程同时访问一个资源,为了避免出现错误,就要实现线程同步。 让这个资源一次只能被一个线程访问。

2. MainThread与WorkerThread

  • MainThread=主线程=UI线程

  • 除此之外的线程叫WorkerThread

  • 所有UI由主线程操作

  • 可能产生阻塞的操作放在Worker Thread中操作

  • 大多数情况下WorkerThread不能操作UI

在安卓中,自己创建出来的线程都叫WorkerThread,所以,除此之外,我们所有的操作都是在MainThread中进行的。

下面这个实验用来证明WorkerThread中不能操作UI:

2.1 WorkerThread中不能操作UI:

具体的实现是:

点击按钮,启动一个线程; 在这个线程中,将试图修改文本域的内容;

输入图片说明

线程内部类: 修改文本域内容

	class MyThread extends Thread {
		public void run(){
			try {
				Thread.sleep(2 * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			textView_1.setText("OK");
		}
	}

按钮监听器类: 创建启动WorkerThread线程

	class ButtonListener implements OnClickListener {
		public void onClick(View v) {
			new MyThread().start();
		}
	}

点击按钮的结果: 提示只有在拥有创建View权限的原始线程(主线程)中才能操作View。

输入图片说明

但一些特殊的组件可以在WorkerThread中被操作,如: · progressbar的setProgress方法

2.2 WorkerThread的作用

Worker Thread虽然不能操作UI,但是它有其他作用:

处理那些可能引发阻塞的操作,如大数据处理。

因为,如果这些可能引发阻塞的操作如果在主线程中处理的话,就可能会引发ANR问题。

  • ANR:应用程序未响应(Application Not Responding)

下面通过一个例子再现这个ANR问题。

例子实现的是:

在主线程中,点击按钮,直接休眠10秒,期间频繁点击屏幕,就会出现ANR提示框。

按钮监听器类:

	class ButtonListener implements OnClickListener {
		public void onClick(View v) {
			try {
				Thread.sleep(10 * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

点击按钮,屏幕卡住,再点几下屏幕,10秒后:

输入图片说明

转载于:https://my.oschina.net/u/2437172/blog/496041

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值