Android中的线程(一)

本文深入探讨了Android中线程的实现方法与生命周期,讲解了MainThread与WorkerThread的区别,以及如何在线程中安全地更新UI,避免ANR问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android中的线程(一)

Java当中的线程

  • 线程的两种实现方法
  • 线程的生命周期
  • 多线程同步

MainThread与Worker Thread

	设置一个TextView和一个Button,当点击Button时就开启一个新的线程,并在线程中修改TextView内容
  • 线程类
	class MyThread extends Thread{
	//Worker Thread
		@Override
		public void run() {
			try {
				Thread.sleep(1 * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			textView.setText("来自于线程的修改");
		}
	}

  • Button的监听器生成线程
class ButtonListener implements OnClickListener{

		@Override
		public void onClick(View arg0) {
			Thread t = new MyThread();
			t.start();
		}
	}

以上代码在语法上没有错误,但无法运行会出现错误:

Only the original thread that created a view hierarchy can touch its views.

这是因为,在主线程之外,原则上是不允许修改UI的。但有一些控件可以在主线程意外修改。例如:ProgressBar

将TextView替换为ProgressBar,将线程更改为,点击Button每隔1/10秒ProgressBar加一
  • 更改的线程类
class MyThread extends Thread{
		@Override
		public void run() {
			for(int i = 0; i <= 100; i ++){
				try {
					Thread.sleep(1 * 100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				progressBar.setProgress(progressBar.getProgress() + 1);
			}
		}
	}

运行结果:
progressBar

选择不再使用Worker Thread,而只使用主线程 这样会出现ANR问题

ANR

点击Button后,主线程直接休眠10秒
  • Button的监听器
class ButtonListener implements OnClickListener{

		@Override
		public void onClick(View arg0) {
			try {
				Thread.sleep(10 * 1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

结果:应用程序堵塞

ANR

**解释:**在一个应用程序中,主线程通常用于接收用户输入,以及将运算结果反馈给用户。所以说,对于一些可能会产生可能会堵塞的操作,必须放置在Worker Thread中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值