zoukankan      html  css  js  c++  java
  • 初识安卓之利用Handler进行线程间数据传递

    背景:点击界面上一个按钮,使文本框中的数字加1,此过程中,如果按钮点击事件是开启了一个新的线程,让文本框中的文字加1,则运算后的结果无法返回到主线程中,主线程拿不到修改后的值,无法更新文本框的内容,这时,使用Handler来进行线程间的数据传递

    以下为DEMO

    public class PostActivityActivity extends Activity {
        private TextView numTV;
        int num;
        //负责线程间的通信,解决新线程修改了数据,但操作不到主线程里去更新的问题
        private Handler handler=new Handler(){
            //msg是从按钮监听线程传过来的,是一个不断变化值的最新值,主线程在这里等待获取
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                if(msg.what==1){
                    //传来的数据是被设置了类型的,所以要区分着拿
                    int num=msg.getData().getInt("num");
                    numTV.setText(num+"");                
                }
            }        
        };
        /** Called when the activity is first created. */
        @Override
      //handler通信方式一:
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            numTV = (TextView) findViewById(R.id.numTV);
        }
        public void add1(View view){
            new Thread(){
                public void run(){    
                    //在新线程里发送一个runnable对象,则主线程就会执行该对象的run方法
           疑问:运算过程还是在主线程中进行的,如何提高效率,等于白做???
                    handler.post(new Runnable() {                    
                        @Override
                        public void run() { 
                     //疑问:没有msg了怎么区分消息类型???
                            // TODO Auto-generated method stub
                            //只有创建numTV的线程才能操作numTV
                            numTV.setText(++num+"");                        
                        }
                    });
                }            
            }.start();
        }
      //handler通信方式二:开启新的线程来执行按钮上的监听方法,可以提高效率,解耦
        public void add2(View view){
            new Thread(){
                public void run(){
                //创建一个消息对象,该对象内部有一个存放数据的map集合
                Message msg=new Message();
                //通过消息对象.getData的形式,可以拿到对象内部的map集合,并可以放入一些数据
                msg.getData().putInt("num", ++num);   
                //把最新的数据通过handler发给创建handler的线程的线程,
                //那个线程就会自动执行handler类的handlerMessage方法
                 
                //发消息之前还可以给msg指定类型,以便在主线程中获取时可以区分的拿到消息
                msg.what=1;
                handler.sendMessage(msg);
            }        
        }.start();
      }
    }

  • 相关阅读:
    搭建nexus私服(maven)
    maven配置本地仓库(从本地仓库下载jar包到.m2仓库)
    关于引入多个jquery冲突的问题(附一个很好用的validate前端验证框架及使用方法)
    java excel导出
    Eclipse+Maven创建webapp项目 及部署在tomcat上
    solr添加IK分词和自己定义词库
    将Mysq数据导入solr索引库
    solr +zookeeper+Jetty 集群搭建
    solr +zookeeper+tomcat 集群搭建
    如何用Maven创建web项目(具体步骤)转载
  • 原文地址:https://www.cnblogs.com/94007boy/p/2791235.html
Copyright © 2011-2022 走看看