Chinaunix首页 | 论坛 | 博客
  • 博客访问: 424299
  • 博文数量: 205
  • 博客积分: 5630
  • 博客等级: 大校
  • 技术积分: 1945
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-06 20:28
文章分类

全部博文(205)

文章存档

2016年(1)

2015年(6)

2014年(9)

2013年(10)

2012年(53)

2011年(25)

2010年(87)

2009年(14)

分类: Android平台

2014-03-03 11:40:06

今天写了一个更新UI的小例子,没想到出了log打印了这样一个错误:Only the original thread that created a view hierarchy can touch its views。goolgle了一下找到了原因。

原来android中相关的view和控件不是线程安全的,我们必须单独做处理。这里借此引出Handler的使用。

 

  Handler的官方描述:


A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler instance is associated with a single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue


.Handler的使用场合:

 

1、 to schedule messages and runnables to be executed as some point in the future;

      安排messages和runnables在将来的某个时间点执行。

2、 to enqueue an action to be performed on a different thread than your own.

      将action入队以备在一个不同的线程中执行。即可以实现线程间通信。比如当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对 象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。


通过Handler更新UI实例:

步骤:

1、创建Handler对象(此处创建于主线程中便于更新UI)。

2、构建Runnable对象,在Runnable中更新界面。

3、在子线程的run方法中向UI线程post,runnable对象来更新UI。

 

详细代码如下:

  1. package djx.android;

  2. import djx.downLoad.DownFiles;
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. import android.widget.TextView;

  10. public class downLoadPractice extends Activity {
  11.     private Button button_submit=null;
  12.     private TextView textView=null;
  13.     private String content=null;
  14.     private Handler handler=null;
  15.     /** Called when the activity is first created. */
  16.     @Override
  17.     public void onCreate(Bundle savedInstanceState) {
  18.         super.onCreate(savedInstanceState);
  19.         setContentView(R.layout.main);
  20.         //创建属于主线程的handler
  21.         handler=new Handler();
  22.         
  23.         button_submit=(Button)findViewById(R.id.button_submit);
  24.         textView=(TextView)findViewById(R.id.textView);
  25.         button_submit.setOnClickListener(new submitOnClieckListener());
  26.     }
  27.     //为按钮添加监听器
  28.     class submitOnClieckListener implements OnClickListener{
  29.         @Override
  30.         public void onClick(View v) {
  31. //本地机器部署为服务器,从本地下载a.txt文件内容在textView上显示            
  32.             final DownFiles df=new DownFiles("");
  33.             textView.setText("正在加载......");
  34.             new Thread(){
  35.                 public void run(){    
  36.                     content=df.downLoadFiles();        
  37.                     handler.post(runnableUi);
  38.                     }                    
  39.             }.start();                        
  40.         }
  41.         
  42.     }

  43.    // 构建Runnable对象,在runnable中更新界面
  44.     Runnable runnableUi=new Runnable(){
  45.         @Override
  46.         public void run() {
  47.             //更新界面
  48.             textView.setText("the Content is:"+content);
  49.         }
  50.         
  51.     };
  52.         
  53.     
  54. }
转载自:http://blog.csdn.net/djx123456/article/details/6325983
阅读(704) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~