当前位置:操作系统 > 安卓/Android >>

android的多线程编程

       多线程编程在编程中占有很大的地位,android手机的多核时代的到来,为了提高资源的利用率,多线程的学习是必须的,一般会用的Handler类,下面是handler的一些介绍。
Handler的特点
1. 传递Message。用于接受子线程发送的数据, 并用此数据配合主线程更新UI。
          在Android中,对于UI的操作通常需要放在主线程中进行操作。如果在子线程中有关于UI的操作,那么就需要把数据消息作为一个Message对象发送到消息队列中,然后,有Handler中的handlerMessage方法处理传过来的数据信息,并操作UI。当然,Handler对象是在主线程中初始化的,以为它需要绑定在主线程的消息队列中。
类sendMessage(Message msg)方法实现发送消息的操作。 在初始化Handler对象时重写的handleMessage方法来接收Messgae并进行相关操作。
2. 传递Runnable对象。用于通过Handler绑定的消息队列,安排不同操作的执行顺序。
         Handler对象在进行初始化的时候,会默认的自动绑定消息队列。利用类post方法,可以将Runnable对象发送到消息队列中,按照队列的机制按顺序执行不同的Runnable对象中的run方法。
Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
Handler和多线程
           post方法虽然发送的是一个实现了Runnable接口的类对象,但是它并非创建了一个新线程,而是执行了该对象中的run方法。也就是说,整个run中的操作和主线程处于同一个线程。
            这样对于那些简单的操作,似乎并不会影响。但是对于耗时较长的操作,当它被加入到消息队列中之后执行会占用很长的时间,以至于处于同一线程的其他操作无法继续执行,就会出现“假死”。为了解决这个问题,就需要使得handler绑定到一个新开启线程的消息队列上,在这个处于另外线程的上的消息队列中处理传过来的Runnable对象和消息。
            这样,当使用sendMessage方法传递消息或者使用post方法传递Runnable对象时,就会把它们传递到与handler对象绑定的处于另外一个线程的消息队列中,它们将在另外的消息队列中被处理。而主线程还会在发送操作完成时候继续进行,不会影响当前的操作。
            这里需要注意,这里用到的多线程并非由Runnable对象开启的,而是ThreadHandler对象开启的。Runnable对象只是作为一个封装了操作的对象被传递,并未产生新线程。
handler的小例子
布局很简单就一个Textview主要是间隔一秒更新一下
[html]  
<TextView  
    android:id="@+id/handlertest"  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:text="@string/hello" />  
 
实现的方法如下:
[java]  
package com.nyist.wj;  
  
import android.app.Activity;  
import android.os.Bundle;  
import android.os.Handler;  
import android.os.HandlerThread;  
import android.os.Message;  
import android.widget.TextView;  
  
public class HandlerActivity extends Activity {  
    TextView handlertest;  
    Handler handler = new Handler() {  
  
        public void handleMessage(android.os.Message msg) {  
  
            switch (msg.what) {  
            case 0:  
                Bundle bundle = msg.getData();  
                String str = bundle.getString("msg");  
                handlertest.setText(str);  
  
                break;  
  
            default:  
                break;  
            }  
        };  
    };  
  
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        handlertest = (TextView) findViewById(R.id.handlertest);  
          
        new myThread(this).start();  
  
    }  
      
    public class myThread extends Thread {  
        int count;  
        HandlerActivity handlerActivity;  
        boolean flag = true;  
  
        public myThread(HandlerActivity handlerActivity) {  
  
            this.handlerActivity = handlerActivity;  
  
        }  
  
        public void run() {  
            while (flag) {  
if (count >= 20) {  
                    flag = false;  
                }  
                String message = "第" + (count++) + "次测试";  
                Bundle bundle = new Bundle();  
                bundle.putString("msg", message);  
                Message testMessage = new Message();  
                testMessage.setData(bundle);  
                testMessage.what = 0;  
                handlerActivity.handler.sendMessage(testMessage);  
                try {  
                    Thread.sleep(1000);  
                } catch (Exception e) {  
  
                }  
            }  
        }  
  
    }  
  
}  
 
实现的结果如图:
\
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,