Android多线程知识点

多线程:包括进程、线程。
进程:一个Android应用就就是一个进程,每个应用在各自的进程中进行。(通常说的关闭手机某个应用进程)
线程:比进程更小的独立运行的基本单位,一个进程可以包含多个线程。如:微信进程app,消息聊天界面包括:对话界面(UI线程)、播放语音(子线程)、下载视频(子线程)、接收消息(子线程)。
:子线程也称Worker线程。
一、Handler
1.初识Handler
例子:点击按钮使文本框内容发生改变

//报错:Only the original thread that created a view hierarchy can touch its views.
void onClick(View v){
	//创建的一个新线程
	Thread thread=new Thread(new Runnable(){
		public void run(){
			textview.setText("文本内容改变");
		}
	});
	thread.start();//开启线程
}

分析原因:
子线程不允许操作主线程中的组件,应该由按钮通知handler,再由handler更新UI组件。
子线程不允许操作主线程中的组件
修改后:

//主线程中定义handler(android.os包中)
Handler handler =new Handler(){
	public void handleMessage(Message msg){//重写匿名内部类
		super.handleMessage(msg);
		if(msg.what==0x123){//获取消息代码,判断
			textview.setText("文本内容改变");
		}
	}
};
//在点击事件里
public void run(){
	handler.sendEmptyMessage(0x123);//发送空消息
}

总结:Handler是android中提供的一个消息处理机制。
作用:1.在任意线程中发送消息。2.在主线程中获取并处理消息。

使用Handler执行周期性指定任务:

final int TIME=60;//定义时间长度60s
final int TIMER_MSG=0x001;//消息代码
private int mProgressStatus=0;//定义任务条完成进度

handler.sendEmptyMessage(TIMER_MSG);//在onCreate()方法中,启动进度条

Handler handler=new Handler(){
	@Override
	public void handleMessage(Message msg){
		super.handleMessage(msg);
		if(TIME-mProgressStatus>0){//当前进度大于0
			mProgressStatus++;//进度加1
			timer.setProgress(TIME-mProgressStatus);//timer为Progress实例化对象,更新进度
			handler.sendEmptyMessageDelayed(TIMER_MSG,1000);//1000毫秒后发送消息
		}else{
			Toast.makeText(MainActivity.this,"时间到",Toast.LENGTH_SHORT).show();
		}
	}
};

使用Handler和Message实现轮播广告:
步骤:布局管理、通过ViewFlipper组件播放广告图片、创建Handler对象,实现3秒更新一次图片、开启广告轮播。

final int FLAG_MSG=0x001;//消息代码
private Message message;//声明消息对象
/*************在onCreate()中**************/
message.=Message.obtain();//获取Message对象
message.what=FLAG_MSG;//设置消息代码
handler.sentMessage(message);//发送消息
/*******在主线程中创建Handler对象,实现3秒更新一次图片****************/
Handler handler=new Handler(){
	@Override
	public void handleMessage(Message msg){
		super.handleMessage(msg);
		if(msg.what==FLAG_MSG){
			flipper.showPrevious();//切换到下一张图片
			message=handler.obtainMessage(FLAG_MSG);//获取Message
			handler.sendMessageDelayed(message.3000);//延迟3秒发送消息
		}
	}
}

二、Looper
不断从消息队列MessageQueue中获取Message,返回给Handler
handler:主线程:系统自动创建Looper对象 子线程:手动创建Looper对象

子线程中创建Looper对象的步骤:初始化Looper对象:prepare()方法->创建handler对象:new Handler()->启动Looper(从消息队列中获取、处理消息)->loop()
LooperThread.java(创建一个子线程)

public class LooperThread extends Thread{
	public Handler handler;//声明一个Handler对象 
	@Override
	public void run(){
		super.run();
		Looper.prepare();//初始化Looper对象!!!!!!!!!!!
		handler=new Handler(){
		@Override
		public void handlerMessage(Message msg){
			super.handleMessage(msg);
				Log.i("Looper",String.valueOf(msg.what));//输出一条日志,标记为Looper
			}
		};
		Message message=handler.obtainMessage();//获取Message
		message.what=0x7;//设置消息代码
		handler.sendMessage(message);//发送消息
		Looper.loop();//启动Looper
	}
}

MainActivity.java中

/************在onCreate()中*****************/
	LooperThread thread=new LooperThread();//创建一个线程
	thread.start();//开启线程

结果:locat中显示: Looper:7

https://blog.csdn.net/chunqiuwei/article/details/52251242
https://blog.csdn.net/wsq_tomato/article/details/80301851

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值