Handler处理长时间事件

摘要:
//定义处理程序对象privateHandlerhandler=newHandler(){//在发送消息时执行处理程序的方法@Overridepublicvoid handleMessage(Messagemsg){//TODOAuto-generatedmethodstubsuper.handleMessage(msg);

当我们在处理一些比较长时间的事件时候,比如读取网络或者数据库的数据时候,就要用到Handler,有时候为了不影响用户操作应用的流畅还要开多一个线程来区别UI线程,在新的线程里面处理长时间的操作。开发的时候遇到数据处理都可以这样用handler,灵活修改一下就可以做各种效果了。

第一步:ProgressDialog弹出旋转框来提示长时间操作。

第二步:开多一个线程处理长时间操作,这里让线程睡觉10秒。

第三部:长时间操作结束后给handler发送一个消息,可以是一个整数,如果这个Activity有多个handler,可以定义多个整数成员变量来区别不同的消息。

第四步:在定义Handler的handlerMessage方法里面把ProgressDialog对象dismiss()掉,把弹出框消灭表示操作完成。

代码如下:

public class Android_HandlerActivity extends Activity {
    /** Called when the activity is first created. */
    //声明变量
    private Button b1;
    private ProgressDialog pd;
    //定义handler对象
    private Handler handler = new Handler(){
        //当有消息发送出来的时候就执行Handler的这个方法
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            //只要执行到这里就关闭对话框
            pd.dismiss();
        }
        
    };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //Resources res = this.getResources();
        
      //查看UI组件所在的线程名
      Log.i("tag", "onCreate()-->"+Thread.currentThread().getName());


      //定义UI组件
      b1= (Button)findViewById(R.id.Button01);
      
      //给按钮绑定单击事件监听器
      b1.setOnClickListener(new View.OnClickListener() {
        
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            //点击按钮后去处理长耗时操作
            processThread();
        }
      });
    }
    protected void processThread() {
        // TODO Auto-generated method stub
        //构建一个下载进度条
        pd= ProgressDialog.show(Android_HandlerActivity.this, "下载文件", "正在下载……");
        Log.i("tag", "processThread()-->"+Thread.currentThread().getName());
        new Thread(){


            @Override
            public void run() {
                Log.i("tag", "run()-->"+Thread.currentThread().getName());


                //在新线程里执行长耗时方法
                longTimeMethod();


                //执行完毕后给handler发送一个空消息
                handler.sendEmptyMessage(0);
            }
            
        }.start();
    }
    //模拟下载文件的长耗时方法
    protected void longTimeMethod() {
        // TODO Auto-generated method stub
        try {


            Log.i("tag", "longTimeMethod-->"+Thread.currentThread().getName());


            Thread.sleep(10000);


            } catch (InterruptedException e) {


            e.printStackTrace();


            }
    }
}

main.xml只是一个简单的Button:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/Button01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>

最后运行图片如下:

Handler处理长时间事件第1张

免责声明:文章转载自《Handler处理长时间事件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇springAOP实现操作日志记录,并记录请求参数与编辑前后字段的具体改变定时重启MySQL、定时重启Apache [任务计划]下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JSP基础知识➣获取参数和过滤器(四)

JSP表单提交和参数获取   JSP表单提交的两种方式:post和get,通过这两种方式提交的参数到后台,获取参数的值主要由request来处理,获取值的方式有以下几种: getParameter(): 使用 request.getParameter() 方法来获取表单参数的值。 getParameterValues(): 获得如checkbox类(名字...

element 导航菜单 控制路由跳转

首先复制官网的例子,在这基础上再修改成我们想要的样子。 <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect"> <el-menu-item index="1">处理中心</el...

C# Cache 设定缓存过期时间方法 绝对过期时间 和 相对过期时间(即:访问激活后不过期)

摘自: http://www.cnblogs.com/zj1111184556/p/3493840.html 1. 设定绝对过期时间 /// <summary> /// 设定绝对的过期时间 /// </summary> /// <param name="CacheKey"&...

Centos 安装MQTT服务器

MQTT  1、MQTT (消息队列遥测传输),协议支持所有平台,把所有联网物品和外部连接起来。用来当作传感器和制动器的通信协议。 主要提供订阅/发布两种消息模式,更 简约、轻量、易用。适合于受限环境(带宽低、网络延迟高、网络通信不稳定)的消息分发。 MQTT 是基于TCP长连接,首先跟MQTT服务器简历TCP连接,然后发送登陆请求,要保持长连接,还要定时...

Serializable 接口与 Java 序列化与反序列化

0. 序列化的意义 从内存到本地即为本地化或者在网络中进行传输,或叫序列化,持久化。 某 Java 类实现 Serializable 接口的目的是为了可持久化(简单理解为本地化),比如网络传输或本地存储,为系统的分布式运行和异构部署提供先决支持条件。若没有序列化,我们熟悉的远程调用(RPC,无法读取远程主机内存中的任何目标,必须首选在远程将目标序列化),对...

H5_0009:关于HTML5中Canvas的宽、高设置问题

关于HTML5中Canvas的宽、高设置问题 Canvas元素默认宽 300px, 高 150px, 设置其宽高可以使用如下方法(不会被拉伸): 方法一:        <canvas  height="500"></canvas> 方法二:使用HTML5 Canvas API操作 OK        var canvas...