参考:魔乐科技视频
消息类:Message,进行消息的封装,并同事可以指定消息的操作形式
No. | 变量或方法 | 类型 | 描述 |
1 | public int what | 变量 | 定义此Message属于何种操作 |
2 | public Object obj(msg.obj) | 变量 | 定义此Message传递的消息数据 |
3 | public int arg1 | 变量 | 传递一些整型数据,一般很少使用 |
4 | public int arg2 | 变量 | 传递一些整型数据,一般很少使用 |
5 | public Handler getTaget() | 普通 | 取得操作此消息的Handler对象 |
消息操作类:Handler
| 方法 | 类型 | 描述 |
| public Handler() | 构造 | 创建一个新的Handler实例 |
| public Handler(Looper looper) | 构造 | 使用指定的队列创建一个新的Handler实例 |
| public final Message obtainMessage(int what,Object obj) | 普通 | 获得一个Message对象 |
| public final Message obtainMessage(int what,int agr1,int arg2,Object obj) | 普通 | 获得一个Message对象 |
| public void handleMessage(Message msg) | 普通 | 处理消息的方法,子类要覆写此方法 |
| public final boolean hasMessages(int what) | 普通 | 判断是否有指定的Message |
| public final boolean hasMessages(int what,Object object) | 普通 | 判断是否有指定的Message |
| public final boolean removeMessages(int what) | 普通 | 删除掉指定的Message |
| public final boolean removeMessages(int what,Object object) | 普通 | 删除掉指定的Message |
| public final boolean sendEmptyMessage(int what) |
| 发送一个空消息 |
| public final boolean sendEmptyMessageAtTime(int what,long uptimeMillis) |
| 在指定的日期时间发送消息 |
| public final boolean sendEmptyMessageDelayed(int what,long delayMillis) |
| 等待指定的时间之后发送消息 |
| public final boolean sendMessage(Message msg) |
| 发送消息 |
|
|
|
|
|
|
|
|
实例:
package org.lxh.demo;
import java.util.Timer; import java.util.TimerTask;
import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.text.format.Time; import android.view.Menu; import android.widget.TextView;
public class MyLooperDemo extends Activity { private TextView info; private static int count=0;//表示更新后的记录 private static final int SET=1;//操作what状态
private Handler myHandler=new Handler(){ public void handleMessage(Message msg) { switch(msg.what){//判断消息的操作类型 case SET: MyLooperDemo.this.info.setText("MLDN:"+count++); break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.looper_demo); this.info=(TextView) findViewById(R.id.getloop);//找到组件 Timer timer=new Timer(); timer.schedule(new MyTask(), 0,1000);//新建一个任务 //注:每次放定时任务前,须确保之前任务已从定时器队列中移除,每次放任务都要新建一个对象, //否则异常,所以同一个定时器任务只能被放置一次
}
private class MyTask extends TimerTask{
@Override public void run() { // TODO Auto-generated method stub Message msg=new Message();//设置更新 msg.what=SET;//操作状态标记 MyLooperDemo.this.myHandler.sendMessage(msg);//发送消息 }
}
}
|
布局文件只有一个TextView。
//task启动后,会在后台一直作业,点返回键退出程序只是销毁了Activity,但仍处于后台运行。--解决方法??下面提供参考方法。
可以发现组件内容是在Handler中处理的,那为什么不在任务调度器中完成,会出现以下异常:
如以下代码:
private class MyTask extends TimerTask{
@Override public void run() { // TODO Auto-generated method stub MyLooperDemo.this.info.setText("MLDN:"+count++); }
} |
抛出一下异常:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. |
原因:子线程不能更新主线程中的各个组件的状态。即:只要是子线程就无法更新组件,那么现在只能采用在子线程之中返回要操作的消息,而后在主线程之中利用Handler处理这些消息,从而实现线程的操作。
以上程序运行,一般情况下按返回键系统会销毁Activity,所以会发现上面的程序运行后再次重新进入,线程仍在继续运行,下面提供3种方法,见onDestroy()里的红色部分:
@Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.looper_demo); this.info=(TextView) findViewById(R.id.getloop);//找到组件 /*timer=new Timer(); timer.schedule(new MyTask(), 0,1000);//新建一个任务 //注:每次放定时任务前,须确保之前任务已从定时器队列中移除,每次放任务都要新建一个对象, //否则异常,所以同一个定时器任务只能被放置一次 */ startTimer(); }
@Override protectedvoid onDestroy() { // TODO Auto-generated method stub super.onDestroy(); //stopTimer();//自定义stop的方法,将任务从队列中移除 //System.exit(0);//强制退出应用 //或者下面这种方式,杀死进程 android.os.Process.killProcess(android.os.Process.myPid()); } privatevoid startTimer(){ if(timer==null){ timer=new Timer(); } if(task==null){ task=new MyTask(); } if(timer!=null&&task!=null){ timer.schedule(task, 0,1000); } }
privatevoid stopTimer(){ if(timer!=null){ timer.cancel(); timer=null; } if(task!=null){ task.cancel(); task=null; } count=0; } |