andrid线程学习

1. 创建线程

 

1.通过Thread类的构造方法创建线程

Thread  thread = new Thread(new Runnable(){

  publicvoid run(){

  }

}).start();

2.通过实现Runnable接口创建线程

public class MainActivity extendsActivity implements Runnable{

  publicvoid run(){

  }

}


2.常见的线程操作


见线程操作 

1.开启线程:

thread.start();

2.线程休眠

Thread.sleep(1000);

3.线程中断

thread.interrupt();

由于当线程执行wait(),join()或者sleep()方法的时候,线程的中断状态将被清除,所以如果在线程中执行了wait(),join()或者sleep()方法的时候。那么想要执行中断那么需要使用一个boolean变量来记录线程的中断状态,并通过该标记变量来控制循环的执行与停止。


§Android引入了Handler消息传输机制主要是为了实现在新建的线程中操作UI界面。


在Android中一个线程对应一个Looper对象,而一个Looper对象又对应一个MessageQueue。MessageQueue用于存放Message的,在MessageQueue中存放的消息按照FIFO原则执行。

Looper对象用来为一个线程开启一个消息循环,用来操作MessageQueue,在默认情况下,Android中新建的线程是没有开启消息循环的。但是主线程,系统会自动为它创建Looper对象,开启消息循环。所以,当在主线程中,应用下面代码创建Handler对象时,就不会出错;而如果在新创建的非线程中,应用下面的代码就会产生异常。

  Handler handler2 = new Handler();

如果想要在非主线程中创建Handler对象,首先需要使用Looper类的prepare()方法来初始化一个Looper对象,然后创建一个Handler对象,再使用Looper类的looper()方法启动Looper,从消息队列里获取和处理消息。写在Looper.loop()之后的代码不会被执行,这个函数的内部是一个循环,当调用Handler.getLooper().quit()方法之后,loop()方法才会终止,后面的代码才能得以运行。


方法

描述

prepare()

用于初始化Looper

loop()

调用Loop方法后,Loop线程就开始真正工作了,它会从消息队列中获取消息和处理消息

myLooper()

用来获取当前线程的Looper对象

getThread()

用于获取Looper对象所属的线程

quit()

用于结束Looper循环


消息类被存放在MessageQueue中,一个MessageQueue中可以包含多个Message对象,每个Message对象可以通过Message.obtain()方法或者Handler.obtainMessage()方法中获得。

尽管Message方法有默认的构造方法,但是在通常情况下,需要使用Message.obtain()方法或者Handler.obtainMessage()方法来从消息池中获得空消息对象,以节省资源。


属性

类型

描述

arg1

int

用来存放整形数据

arg2

int 

用来存放整形数据

obj

Object

用来存放发送给接收器的Object类型的任意对象

replyTo

Messenger

用来指定该Message发送到何处可选的Messager对象

what

int

用于指定用户自定义的消息代码,这样接收者可以了解这个消息的信息

消息处理类允许发送和处理Message或者Runnable对象到其所在的线程的MessageQueue中。

Handler有以下两个主要作用:

(1)将Message或Runnable应用post()方法或者sendMessage()方法发送到MessageQueue中,在发送时可以指定延迟时间,发送时间或者要携带的Bundle数据。当MessageQueue循环到Message时,调用者可以调用相应的handlerMessage()方法对其进行处理.

(2)在子线程中与主线程进行通信也就是在工作线程中与UI线程进行通信。

在一个线程中只能有一个Looper或者MessageQueue,但是可以有多个Handler,而且这些Handler可以共享同一个Looper和MessageQueue

方法

描述

handleMessage(msg)

处理消息的方法,通常重写该方法来处理消息,在发送消息时候该方法会自动回调

post(Runnable)

立即发送Runnable对象,该Runnable对象会被封装成Message对象

postAtTime(Runnable,time)

定时发送Runnable对象

postDelayed(Runnable,time)

延迟发送Runnable对象

sendEmptyMessage(msg)

发送空消息

sendMessage(msg)

发送消息

sendMessageAtTime(msg,time)

定时发送消息

sendMessageDelayed(msg,time)

延迟发送消息


例子:  


// 子线程   

publicclass notMainThread extends Thread {

  public Handler handler1 ;

  @Override

  public void run() {

  super.run();

  Looper.prepare();

  handler1 = new Handler(){

  public void handleMessage(Message msg) {

  switch (msg.what) {

  case 2:

  Log.i("notMainThread","来自主线程的消息");

  break;

  default:

  break;

  }

  super.handleMessage(msg);

  }

  };

  Looper.loop();

  }

}


// 主线程

publicclass MainActivity extends Activity {

  Handler handler = null;

  notMainThread notMain= null;

  protected void onCreate(BundlesavedInstanceState) {

  ................................

  handler = new Handler(){

  public void handleMessage(Message msg) {

  switch (msg.what) {

  case 1:

  Log.i("MainActivity","在主线程中获得消息消息代码");

  break;

  default:

  break;

  }

  super.handleMessage(msg);

  }

  };

  notMain = new notMainThread();

  notMain.start();

  .................................

  //发送消息到非主线程

  btn1.setOnClickListener(new OnClickListener(){

  public void onClick(View arg0) {

  Message m =notMain.handler1.obtainMessage();//获取非主线程的一个消息

  m.what=2;

  notMain.handler1.sendMessage(m);//发送消息

  }

  });

  //发送消息到主线程

  btn2.setOnClickListener(new OnClickListener(){

  public void onClick(View arg0) {

  Message m =MainActivity.this.handler.obtainMessage();//获取非主线程的一个消息

  m.what=1;

  MainActivity.this.handler.sendMessage(m);//发送消息

  }

  });

  }

}




例子 (非主线程)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值