Handler的使用(一)

本文介绍如何利用Android中的Handler实现异步消息处理,通过将耗时操作放入单独线程,避免阻塞UI线程,提高用户体验。文章提供了一个具体的示例,展示了如何创建Handler对象、线程对象,并通过post方法将线程加入消息队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果平时下载一个文件需要耗费比较长的时间的话,那么下载过程中,如果把功能直接写在Activity中,作为Activity的一部分的话,那么可能导致在下载的过程中,整个Activity是没有响应的,造成用户不友好体验,过长时间,Activity还可能报错。
那么这里的解决办法是:下载放在一个的单独线程,Activity是一个另一个线程,这样用户体验更好。
Handler就是为了实现这样的功能的。

例子

首先我们在xml布局文件中加上两个按钮。
再在HandlerActivity.java中根据控件ID得到控件对象,并给这两个按钮设置相应的监听器。
代买如下:


import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class HandlerActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler);
        Button start = (Button)this.findViewById(R.id.start);
        start.setOnClickListener(new startButtonListener());
        Button stop = (Button)this.findViewById(R.id.stop);
        stop.setOnClickListener(new stopButtonlistener());
        
    }
    //Android操作系统所提供的Handler类
    Handler handler = new Handler();
    //线程类,采用匿名内部类实现runnable接口
    Runnable updateThread = new Runnable(){
    	//线程运行状态:就绪,运行(run中代码),阻塞,死亡(run代码运行完)

		@Override
		public void run() {
			//handler.postDelayed(Runnable r, delayMillis);
			//postDelayed方法
			//1.消息队列,先进先出,消息加入队列,再从队列中一个一个的取出消息内容
			//2.post就是将updateThread线程加入Delayed消息队列中去,
			//当从消息队列中取出该线程时就会启动线程的运行,3000ms后,再把updateThread对象加入到消息队列中去,隔3s加进去一次
			//加进去的线程不一定能马上执行,每一个handler都有一个与之相关联的消息队列
			handler.postDelayed(updateThread, 3000);
			
		}
    	
    };
    
    
    class startButtonListener implements OnClickListener{

    	@Override
    	public void onClick(View arg0) {
    		//handler.post(Runnable r));
    		//post方法将updateThread线程加入到消息队列中去,这里没有延时
    		//第一次加入,消息队列中只有它,所以它一旦被加进去就会马上被执行handler.postDelayed(updateThread, 3000);
    		
    		handler.post(updateThread);
    	}
    }
    
    class stopButtonlistener implements OnClickListener{

    	@Override
    	public void onClick(View arg0) {
    		//handler.removeCallbacks(Runnable r);
    		//removeCallbacks方法,将线程不再执行
    		handler.removeCallbacks(updateThread);
    	}
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.handler, menu);
        return true;
    }
    
}

总结

  • 首先创建一个Handler对象
  • 运用内部类方法生成一个线程对象
  • 调用Handler的post方法将所要执行的线程对象添加到队列中去
  • 将要执行的操作(下载大文件等)写在线程对象的run方法中 -->异步消息处理
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值