当前位置: 代码迷 >> Android >> android的线程特性
  详细解决方案

android的线程特性

热度:47   发布时间:2016-05-01 17:24:50.0
android的线程特点

???????? android的view和ui组件不是线程安全的,所以android不允许开发者启动线程访问用户界面中的ui组件,这是就额外定义一个handler来处理对ui组件的操作。。。

?

Handler 为Android操作系统中的线程通信工具,包为android.os.Handler。

与Handler绑定的有两个队列,一个为消息队列,另一个为线程队列。Handler可以通过这两个队列来分别:

  1. 发送、接受、处理消息–消息队列;
  2. 启动、结束、休眠线程–线程队列;

Android OS中,一个进程被创建之后,主线程(可理解为当前Activity)创建一个消息队列,这个消息队列维护所有顶层应用对象(Activities, Broadcast receivers等)以及主线程创建的窗口。你可以在主线程中创建新的线程,这些新的线程都通过Handler与主线程进行通信。通信通过新线程调用 Handler的post()方法和sendMessage()方法实现,分别对应功能:

  1. post() ?将一个线程加入线程队列;
  2. sendMessage() 发送一个消息对象到消息队列;

当然,post()方法还有一些变体,比如postDelayed()、postAtTime()分别用来延迟发送、定时发送;

消息的处理,在主线程的Handler对象中进行;具体处理过程,需要在new Handler对象时使用匿名内部类重写Handler的handleMessage(Message msg)方法;

线程加入线程队列可以在主线程中也可以在子线程中进行,但都要通过主线程的Handler对象调用post()。

?

?

?

  • public?class?HandlerActivity?extends?Activity?{??
  • ??????
  • ????Button?btnStart,btnEnd;??
  • ????ProgressBar?proBar;??
  • ??????
  • ????/**?Called?when?the?activity?is?first?created.?*/??
  • [email protected]
  • ????public?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.main);??
  • ??????????
  • ????????//通过控件的ID来实例化控件对象??
  • ?????????btnStart?=?(Button)findViewById(R.id.start);??
  • ????????btnEnd?=?(Button)findViewById(R.id.end);??
  • ????????proBar?=?(ProgressBar)findViewById(R.id.pBar);??
  • ??????????
  • ????????//开始按钮触发事件??
  • ????????btnStart.setOnClickListener(new?View.OnClickListener()?{??
  • ??????????????
  • [email protected]
  • ????????????public?void?onClick(View?v)?{??
  • ????????????????proBar.setVisibility(View.VISIBLE);??
  • ????????????????updateBarHandler.post(updateBarThread);??
  • ????????????}??
  • ????????});??
  • ??????????
  • ????????//结束按钮触发事件??
  • ????????btnEnd.setOnClickListener(new?View.OnClickListener()?{??
  • ??????????????
  • [email protected]
  • ????????????public?void?onClick(View?v)?{??
  • ????????????????updateBarHandler.removeCallbacks(updateBarThread);??
  • ????????????}??
  • ????????});??
  • ????}??
  • ??????
  • ??????
  • ?????//创建一个Handler对象??
  • ?????Handler?updateBarHandler?=?new?Handler(){??
  • ??
  • [email protected]
  • ????????public?void?handleMessage(Message?msg)?{??
  • ????????????proBar.setProgress(msg.arg1);??
  • ????????????updateBarHandler.post(updateBarThread);??
  • ????????}??
  • ??????????
  • ????};??
  • ??????
  • ????//更新ProgressBar的线程对象??
  • ????Runnable?updateBarThread?=?new?Runnable()?{??
  • ????????int?i?=?0;??
  • [email protected]
  • ????????public?void?run()?{??
  • ????????????ii?=?i?+?10;??
  • ????????????Message?msg?=?updateBarHandler.obtainMessage();??
  • ????????????msg.arg1?=?i;??
  • ????????????try{??
  • ????????????????Thread.sleep(2000);??
  • ????????????}catch?(InterruptedException?e)?{??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????????????updateBarHandler.sendMessage(msg);??
  • ????????????if(i?==?100){??
  • ????????????????updateBarHandler.removeCallbacks(updateBarThread);??
  • ????????????}??
  • ????????}??
  • ????};??
  • }??
  • ?

    在主线程HandlerActivity中,通过Handler对象将updateBarThread子线程对象添加到主线程的队列中,并不是另外开启了一个新的线程去执行。

      相关解决方案