今天终于进了工作室第一轮考核,不容易但是不辛苦,因为自己喜欢
今天想写一写关于handler的一些内容
Handler 1在新开启的线程中发送消息
2接受子线程发送的数据, 并根据数据配合主线程更新UI.
一般程序运行的时候会启动主线程,很多控件可能会触发很多事件,而如果你的操作如果将会是一个延时操作,比如说联网更新操作,是不允许在主线程中执行的,因为联网操作超过五秒的话那程序就回出现假死状态,也就会强退。所以就要开启新线程去做一些延时操作,然而如果你在新开的线程里面又要更新UI,改变空间的文字及背景等,然后android主线程是线程不安全的!这句话的意思就是更新UI操作只能在主线程中完成,副线程不能这样做,而为什么是这样的呢?那是因为如果你同时多个线程去操作它的时候,可能会造成冲突,所以在android中是不允许这样的操作的。那要怎么实现呢?那就是handler的作用了,我们可以通过handler告诉主线程,然后让主线程去执行你要完成的操作
下面的例子是疯狂android讲义里的一个自动播放动画的实例
package org.crazyit.event;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
/**
* Description:
* <br/>site: <a href="http://www.crazyit.org">crazyit.org</a>
* <br/>Copyright (C), 2001-2014, Yeeku.H.Lee
* <br/>This program is protected by copyright laws.
* <br/>Program Name:
* <br/>Date:
* @author Yeeku.H.Lee kongyeeku@163.com
* @version 1.0
*/
public class HandlerTest extends Activity
{
// 定义周期性显示的图片的ID
int[] imageIds = new int[]
{
R.drawable.java,
R.drawable.ee,
R.drawable.ajax,
R.drawable.xml,
R.drawable.classic
};
int currentImageId = 0;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView show = (ImageView) findViewById(R.id.show);
final Handler myHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
// 如果该消息是本程序所发送的
if (msg.what == 0x1233)
{
// 动态地修改所显示的图片
show.setImageResource(imageIds[currentImageId++
% imageIds.length]);
}
}
};
// 定义一个计时器,让该计时器周期性地执行指定任务
new Timer().schedule(new TimerTask()
{
@Override
public void run()
{
// 发送空消息
myHandler.sendEmptyMessage(0x1233);
}
}, 0, 1200);
}
}