• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

匪徒在线的博客

路漫漫其修远兮,吾将上下而求索。
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

初识安卓之利用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();
  }
}

posted on 2012-11-27 17:56  匪徒在线  阅读(486)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3