`

通过一个android中的handler处理场景想到的

阅读更多
本程序主要功能步骤如下:
   1.利用Timer 编写一个倒计时程序,程序使用Timer和TimerTask来完成倒计时
    2.同时使用sendMessages方法发送消息
    3.在HanleMessage里更新UI。


最原始的代码方式:
    1.事件处理方式使用匿名内部类
     2.TimerTask实现也使用匿名内部类
缺点:1.代码通用性差 2.阅读性差  
   
    	private Button button1,button2;
	
	private TextView tv;//显示计时内容
	
	private Handler handler;
	
	private int count=20;//从20起 开始倒计时
	

	private Timer timer;
	
	private TimerTask timerTask;

  @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        button1=(Button)findViewById(R.id.Button01);
        button2=(Button)findViewById(R.id.Button02);
        tv=(TextView)findViewById(R.id.TextView01);
        
        doHandler();
        button1.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
			   MainActivity.this.startCount();
			   
			}
		});
        
        button2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				MainActivity.this.stopCount();
			}
		});
        
      
        
        
        
    }




    //开始计时 
    private void startCount()
    {
    	timer =new Timer();
    	timerTask=new TimerTask() {
			
    		@Override
    		public void run() {
    			// TODO Auto-generated method stub
    			count--;
    			Bundle bundle=new Bundle();
    			bundle.putInt("time", count);
    			Message msg=new Message();
    			msg.setData(bundle);
    			msg.what=0;
    			handler.sendMessage(msg);
    			
    		}
		};
    	
		timer.schedule(timerTask, 1000, 1000);//没隔一秒执行一次
    }
    
    //结束计时
    private void stopCount()
    {
    	timer.cancel();
    }
    

	
    /**
     * doHandler
     * */
    private void doHandler()
    {
    	handler=new Handler()
    	{
    		@Override
    		public void handleMessage(Message msg) {
    			// TODO Auto-generated method stub
    			super.handleMessage(msg);
    			switch(msg.what)
    			{
    			   case 0:
    			     Bundle bundle= msg.getData();
    			     tv.setText(String.valueOf(bundle.getInt("time")));
    			     break;
    			   default :break;
    			}
    			
    		}
    	};
    }




我们可以尝试以下改造
1.:按钮监听事件可以放到一个方法中。消除匿名内部类 实现接口
2.Handler中实现也可以按照上述方法
3.对了TimerTask中执行的定时器任务方法 可以抽象出来放到回调接口里面
因为现实场景中用到定时任务的class会很多,这样只需要实现回调接口即可。
这样可以完全消除内部类了


//新增回调接口
public interface ITaskCallBack {

	void taskRun();
}



//TimerTask的子类Task,抽象方法在通过回调接口去实现

public class Task extends TimerTask{

	ITaskCallBack callback;
	
	public void setCallback(ITaskCallBack callback) {
		this.callback = callback;
	}
	
	public Task(ITaskCallBack iTaskCallBack) {
		// TODO Auto-generated constructor stub
		super();
		this.callback=iTaskCallBack;
	}
	
	
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		callback.taskRun();
	}
}



这样在MainActivity中要实现ITaskCallBack ,Callback,OnClickListener接口
并实现抽象方法


public class MainActivity extends Activity implements Callback,OnClickListener,ITaskCallBack{
    
	private Button button1,button2;
	
	private TextView tv;
	
	private Handler handler;
	
	private int count=20;//从20起 开始倒计时
	

	private Timer timer;
	
	private TimerTask timerTask;
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        button1=(Button)findViewById(R.id.Button01);
        button2=(Button)findViewById(R.id.Button02);
        tv=(TextView)findViewById(R.id.TextView01);
        
        handler=new Handler(this);
        
        button1.setOnClickListener(this);
        
        button2.setOnClickListener(this);
      
    }
    
    
    
    
    
    //开始计时 
    private void startCount()
    {
    	timer =new Timer();
    	
    	//这个地方新创建了TimerTask的子类实现了抽象方法
          //这里的抽象方法交给回调接口处理,这样就TimerTask的匿名内部类实现消了。
 
    	Task task=new Task(this);
    	
		timer.schedule(task, 1000, 1000);//没隔一秒执行一次
    }
    
    //结束计时
    private void stopCount()
    {
    	timer.cancel();
    }
    

	
    
    
    @Override
    public boolean handleMessage(Message msg) {
    	// TODO Auto-generated method stub
    
		switch(msg.what)
		{
		   case 0:
		     Bundle bundle= msg.getData();
		     tv.setText(String.valueOf(bundle.getInt("time")));
		     break;
		   default :break;
		}
    	
    	return false;
    }
    
    
    @Override
    public void onClick(View v) {
    	// TODO Auto-generated method stub
    	switch(v.getId())
    	{
    		case R.id.Button01:
    			startCount();
    			break;
    		case R.id.Button02:
    			stopCount();
    		break;
    	    default:break;
    	}
    	
    }
    
    
    
    @Override
    public void taskRun() {
    	// TODO Auto-generated method stub
    	   count--;
    	   Message msg=new Message();
           Bundle date = new Bundle();// 存放数据
             date.putInt("time", count);
           msg.setData(date);
           msg.what=0;
           handler.sendMessage(msg);
    }
    
    
}



既然是计时器还可以使用自定义线程嘛,于是可以线程每sleep 1秒发送发送消息触发
显示线程。


修改的代码如下:
1.新增加的线程类
   public class TimeThread extends Thread{
	private Handler handler;
	private int count;
	public TimeThread(Handler handler,int count) {
		// TODO Auto-generated constructor stub
		this.handler=handler;
		this.count=count;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		Bundle bundle=new Bundle();
		Message msg=new Message();
		while(true)
		{
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				
			}
			--count;
			bundle.putInt("time", count);
			msg.what=0;
			msg.setData(bundle);
			handler.sendMessage(msg);
		}
	}
	
}


2.Activity类的事件方法:
   
private void startCount()
    {
    	 tt=new TimeThread(handler, count);
    	 tt.start();
    }

   


  
分享到:
评论

相关推荐

    Android Handler消息处理顺序分析

    Handler是Android中的一个类,用于发送和处理消息。它通常与Looper和Message配合工作,允许开发者在不同的线程之间传递信息。在主线程(UI线程)中,有一个默认的Looper对象,它持续不断地从消息队列中取出Message并...

    Android_Handler消息处理机制

    在Android系统中,Handler、Message和Looper构成了一个关键的异步通信机制,即Handler消息处理机制。这个机制允许Android应用程序在不同的线程间传递消息,处理UI更新等操作,是多线程编程中的重要组成部分。下面...

    android 中Handler 的几种写法

    在Android开发中,`Handler`是一个至关重要的组件,它用于在主线程中处理来自其他线程的消息,确保UI更新和事件处理的同步性。本文将详细介绍`Handler`的几种常见写法,以及如何使用`Handler.Callback`进行消息处理...

    Android中handler的使用

    当Handler发送一个Message到MessageQueue中时,Looper会捕获并分发这个消息到对应的Handler进行处理。 1. **Handler的创建**: Handler的创建通常有两种方式:匿名内部类和静态内部类。匿名内部类直接在需要使用...

    Android_Handler详解(一)

    在Android开发中,Handler是一个至关重要的组件,它与线程、消息队列和Looper紧密关联,用于实现不同线程间的通信。本篇将深入探讨Handler的基本概念、使用方法以及其在多线程环境中的作用。 1. Handler是什么? ...

    一个activity中多个handler和消息的处理过程

    首先,Handler是Android中的一个关键组件,它允许我们通过Message对象在不同的线程之间传递数据和执行任务。通常,我们在主线程(UI线程)中创建一个Handler实例,用于接收由其他工作线程发送的消息,并在适当的时间...

    android handler的一些测试

    在Android系统中,每个线程都有一个与之关联的`Looper`,它是消息队列的循环器,负责取出`Message`并交给相应的`Handler`处理。默认情况下,只有主线程(UI线程)有一个运行的`Looper`。要在线程中使用`Handler`,...

    android-Handler的使用

    在 Android 应用程序启动时,系统会默认创建一个主线程,也称为 UI 线程,负责处理所有的界面交互和事件分发。如果在主线程中执行耗时操作,如网络请求或大文件读取,会导致 UI 停止响应,出现“应用无响应”(ANR)...

    Android Studio通过Handler制作简单的计时器

    总的来说,通过这个实例,你不仅学会了如何在Android Studio中创建一个简单的计时器应用,还掌握了Handler的基本用法。理解并熟练掌握Handler对于进行Android应用开发至关重要,因为它是处理主线程与子线程通信、...

    androidHandler测试的demo

    在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,它们共同构建了一个消息处理机制。这个机制允许开发者在不同的线程之间传递消息,通常用于更新UI或者执行异步任务。下面我们将深入...

    模拟Android Handler机制Demo

    【Looper】是Android中的一个类,它在一个线程中循环读取MessageQueue(消息队列),一旦发现有Message,就将其传递给相应的Handler进行处理。每个线程都有自己的Looper,但默认情况下只有主线程(UI线程)有一个...

    详解Android中Handler的内部实现原理

    Looper是运行在一个线程中的循环器,它负责不断地从MessageQueue中取出消息并分发给相应的Handler进行处理。 在创建Handler时,有四个构造函数可供选择,它们分别对应不同的初始化方式。前两个构造函数没有显式指定...

    android中Handler的使用方法和总结

    Android 中 Handler 的使用方法和总结 Handler 是 Android 中的一种非常重要的组件,它起到了...因此,在 Android 应用程序的开发中,Handler 是一个非常重要的组件,需要充分利用它来提高应用程序的性能和用户体验。

    android多线程handler/message机制详解

    在上面的代码中,我们首先在 UI 线程中创建了一个 Handler,然后在后台线程中执行了一些操作,并将结果通过 Message 发送给 Handler,Handler 将其处理并将结果显示给用户。 Handler 和 Message 机制是 Android 多...

    Android_Handler的线程队列Demo

    Handler是Android中的一个关键类,它允许开发者在不同的线程之间发送和处理消息。通常,主线程负责更新UI,而其他工作线程则执行耗时操作。Handler就是连接这两者的桥梁,通过发送Message对象到消息队列,由Looper...

    Android中的Handler的具体用法

    在Android开发中,`Handler`是一个至关重要的组件,它用于处理与UI线程交互的异步消息通信。本文将深入探讨`Handler`的工作原理、如何使用以及它在Android应用程序中的实际应用。 `Handler`机制是Android系统为了...

    Android 用handler机制联网获取图片.zip

    标题提到的“Android用Handler机制联网获取图片”是一个典型的Android应用开发场景,涉及网络请求、图片下载以及主线程与工作线程间的通信。 首先,我们需要理解Handler、Looper和Message三个核心组件的关系。...

    android handler runnable使用实例(关键是内部run中停止)

    通常,我们会在主线程(UI线程)中创建一个Handler实例,这样处理的消息就会在这个线程中执行,这对于更新UI是必要的,因为Android只允许主线程操作UI。 `Runnable`是一个接口,它定义了一个单个方法`run()`. 任何...

    android 实例 Activity 之间通过 Handler 通信

    Handler是Android中的一个关键组件,它主要用于处理由Looper对象分发的消息(Message)。当在主线程(UI线程)中创建一个Handler实例时,这个Handler会与当前线程的Looper关联。通过post()或sendMessage()方法发送...

    Fragment与Activity使用Handler进行交互

    Handler是Android中的一个消息处理类,它主要用来处理运行在主线程中的Message对象。通过创建一个Handler实例并与Looper(消息循环)关联,我们可以发送和处理Message,从而实现在不同线程间的数据传递和回调。 在...

Global site tag (gtag.js) - Google Analytics