读书人

android的线程特性

发布时间: 2012-09-09 09:27:54 作者: rapoo

android的线程特点

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

?

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

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

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

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

    post() ?将一个线程加入线程队列;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.?*/??????@Override??
  • ????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()?{????????????????
  • ????????????@Override??????????????public?void?onClick(View?v)?{??
  • ????????????????proBar.setVisibility(View.VISIBLE);??????????????????updateBarHandler.post(updateBarThread);??
  • ????????????}??????????});??
  • ??????????????????//结束按钮触发事件??
  • ????????btnEnd.setOnClickListener(new?View.OnClickListener()?{????????????????
  • ????????????@Override??????????????public?void?onClick(View?v)?{??
  • ????????????????updateBarHandler.removeCallbacks(updateBarThread);??????????????}??
  • ????????});??????}??
  • ????????????
  • ?????//创建一个Handler对象???????Handler?updateBarHandler?=?new?Handler(){??
  • ??????????@Override??
  • ????????public?void?handleMessage(Message?msg)?{??????????????proBar.setProgress(msg.arg1);??
  • ????????????updateBarHandler.post(updateBarThread);??????????}??
  • ??????????????};??
  • ??????????//更新ProgressBar的线程对象??
  • ????Runnable?updateBarThread?=?new?Runnable()?{??????????int?i?=?0;??
  • ????????@Override??????????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子线程对象添加到主线程的队列中,并不是另外开启了一个新的线程去执行。

  • 读书人网 >Android

    热点推荐