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

				}
			}
		}

	}

}


实现的结果如图:

 

 

 

posted @   程序员Android的博客  阅读(53)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示