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

1.回顾JAVA中的线程

  • 线程的两种实现方式

1 继承Thread类多线程

2 实现Runnable接口大数据

二者区别:线程

  • 前者表明一个线程code

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

  • 多线程同步接口

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

2. MainThread与WorkerThread

  • MainThread=主线程=UI线程资源

  • 除此以外的线程叫WorkerThread同步

  • 全部UI由主线程操做it

  • 可能产生阻塞的操做放在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秒后:

输入图片说明

相关文章
相关标签/搜索