解析Android中的线程
一、Android有两种方式处理线程:
比较耗时的操作放在后台服务,通过通知机制通知用户使用的活动(activity);在后台线程中处理耗时的操作
二、使用Handler
创建后台线程最友好的办法是创建一个Handler子类的实例。只需一个Handler对应一个Activity。自定义的后台线程可与 Handler通信,Handler将与UI线程一起工作。和Handler通信,需要两个选项,message和runnable对象。
三、Message
发送Message到Handler,第一步调用obtainMessage(),从池中得到Message对象。
然后,可通过消息队列将Message发送给Handler,通过sendMessage…()方法族:
sendMessage() 立即发送Message到消息队列
sendMessageAtFrontOfQueue() 立即发送Message到队列,而且是放在队列的最前面
sendMessageAtTime() 设置时间,发送Message到队列
sendMessageDelayed() 在延时若干毫秒后,发送Message到队列
为了处理Message,Handler需要实现handleMessage(),当Message出现在队列中时,会调用handleMessage()方法。另外,Handler可在需要时更新UI。
以下示例演示一个进度条,每隔1秒钟增加1/20个单位。效果图:
java代码:
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <ProgressBar
- android:id="@+id/progress"
- style="?android:attr/progressBarStyleHorizontal"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"/>
- </LinearLayout>
java代码:
- packageeoe.demo;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.os.Handler;
- importandroid.os.Message;
- importandroid.widget.ProgressBar;
- publicclassShowThreadextendsActivity{
- ProgressBarbar;
- Handlerhandler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- bar.incrementProgressBy(5);
- }
- };
- booleanisRunning=false;
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- bar=(ProgressBar)findViewById(R.id.progress);
- }
- @Override
- protectedvoidonStart(){
- super.onStart();
- bar.setProgress(0);
- Threadbackground=newThread(newRunnable(){
- @Override
- publicvoidrun(){
- for(inti=0;i<20&&isRunning;i++){
- try{
- Thread.sleep(1000);
- }catch(InterruptedExceptione){
- }
- handler.sendMessage(handler.obtainMessage());
- }
- }
- });
- isRunning=true;
- background.start();
- }
- @Override
- protectedvoidonStop(){
- super.onStop();
- isRunning=false;
- }
- }
小结:
当第一次启动一个android程序是,android会自动创建一个称为“main”主线程的线程。这个线程很重要,因为它负责吧时间分派到相应对控件,其中就包括屏幕绘图时间,它同样是用户与android控件交互的线程。
更多相关文章
- 如何在后台运行Linux命令?
- 安卓ListView 数据分批加载
- httpClient及android 原生接口实现下载并显示图片
- Android(安卓)AsyncTask使用以及源码解析
- Android面试题目收集
- PHP新手入门1——表单
- Android(安卓)activity与service中的子线程 (入门级)
- Android(安卓)消息机制——你真的了解Handler?
- AsyncTask的使用及源码分析