android中子线程更新UI的几种方法

  • 列表内容

  • 第一种常用的生成Handler对象的方法

这是在主线程中 mHandler 是成员变量
Handler mHandler = new Handler() {  
        @Override  
        public void handleMessage(Message msg) {  
            super.handleMessage(msg);  
            switch (msg.what) {  
            case 0:  
                //在这里得到数据,并且可以直接更新UI  
                String data = (String)msg.obj;  
                updateWeather();  //刷新数据
                textView.setText(data);  
                break;  
            default:  
                break;  
            }  
        }  

    };

这是在子线程中
   ....   onClick(View v){
    switch(v.getId()){
    case R.id.bt:
         new Thread(new Runnable(){  
            @Override  
            public void run() {  
                //耗时操作,
                Http......网路请求的操作
                //需要数据传递,用下面方法;  
                Message msg =new Message();  
                msg.what = 0;
                msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等;  
                //完成之后发送消息给Handler 
                mHandler.sendMessage(msg);  
            }  

        }).start();  
    }
}
  • 第二种方法:用Activity对象的runOnUiThread方法更新
//这是在Activity中:
new Thread() {  
            public void run() {  
                //这儿是耗时操作,完成之后更新UI;
                http....网路请求  
                runOnUiThread(new Runnable(){  
                      @Override  
                    public void run() {  
                        //更新UI  
                       imageView.setImageBitmap(bitmap);  
                    }    
                });  
            }  
        }.start(); 

//如果不在Activity中则需要得到上下文来调用
Activity activity = (Activity) imageView.getContext();  
                activity.runOnUiThread(new Runnable() {  
                    @Override  
                public void run() {                                imageView.setImageBitmap(bitmap);  
                    }  
                });
如果Thread定义在别的地方,传递一个activity对象就行!
  • 第三种方法:View.post(Runnable r)的方法
imageView.post(new Runnable(){  

                    @Override  
                    public void run() {  
                        imageView.setImageBitmap(bitmap);  
                    }  

                }); 
需要在该方法中传递一个View对象
  • 第四种方法Handler.post(Runnable r)方法
//通过点击按钮事件,执行网路耗时操作,得到的数据显示到UI上
主线程中 Handler handler = new Handler() ;
public void onClick(View v) {
                //开启线程
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String str= null;//这里必须要写上 = null !!初始化
                    try{
                        Thread.sleep(3000);//这里写网路请求操作
                        str = "网路请求得到的数据";//比如json数据
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                       // 这里也必须声明为final 
                        final String finalStr = str;
                        //调用方法Handler.post(r);
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                //在这里将得到的数据更新到UI中
                                textView.setText(finalStr);                            }
                        });
                    }
                }).start();
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值