看魔乐科技消息传送笔记

参考:魔乐科技视频

 

消息类: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 whatObject object)

普通

判断是否有指定的Message

 

public final boolean removeMessages(int what)

普通

删除掉指定的Message

 

public final boolean removeMessages(int whatObject 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;

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值