• Handler处理长时间事件


    当我们在处理一些比较长时间的事件时候,比如读取网络或者数据库的数据时候,就要用到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>

    最后运行图片如下:

  • 相关阅读:
    django model:auto_now_add 和 auto_now
    算法(2):数据结构
    Flask(2):登陆验证
    Flask(1):基本示例、配置文件、路由、请求和响应、模板渲染
    linux基础
    算法(1):查找&排序
    利用dispatch_once创建单例
    UIScrollView的属性总结
    ios开发 UITableViewController
    [深入浅出Cocoa]详解键值观察(KVO)及其实现机理
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5602508.html
Copyright © 2020-2023  润新知