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主要是间隔一秒更新一下

    <TextView
        android:id="@+id/handlertest"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />


实现的方法如下:

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) {

				}
			}
		}

	}

}


实现的结果如图:

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值