浏览 9261 次
锁定老帖子 主题:handler异步控制Runnable
精华帖 (0) :: 良好帖 (5) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-02-20
1 关于改变Activity中TextView的方法作者:Legend qq:158067568 Activity中的TextView如果直接写一个线程时时刷新,即调用TextView的setText方法,那么程序不会报错,但是,TextView中的内容也不会改变。 1.1改变TextView中的内容改变TextView中的内容可以通过Handler。Handler是Android中的消息发送器,其在哪个Activity中创建就属于且紧紧属于该Activity。还可以说其在哪个线程中new的,就是那个线程的Handler。 如果想改变TextView中的内容,就要通过Handler来实现,比如想每秒钟更新一下时间,那么如下: <!--[if !supportLists]-->(1) <!--[endif]-->在Activity中创建Handler <!--[if !supportLists]-->(2) <!--[endif]-->创建一个实现了Runnable接口的线程类 <!--[if !supportLists]-->(3) <!--[endif]-->通过Handler的Post方法将Runnable添加进入消息队列 <!--[if !supportLists]-->(4) <!--[endif]-->ok了。呵呵 代码
1 package rznh.zcl; 2 import android.app.Activity; 3 import android.os.Bundle; 4 import android.os.Handler; 5 import android.view.View; 6 import android.widget.Button; 7 import android.widget.TextView; 8 public class MyActivity extends Activity { 9 /** Called when the activity is first created. */ 10 private Button butStart; 11 private Button butStop; 12 TextView tv; 13 int i=0; 14 Handler handler=new Handler(); 15 @Override 16 public void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.main); 19 /** 20 * Handler在那个Activity中new的就且仅属于那个Activity的 21 * */ 22 //all by zcl qq158067568 23 butStart=(Button)findViewById(R.id.Button01); 24 butStop=(Button)findViewById(R.id.Button02); 25 tv=(TextView)findViewById(R.id.TextView01); 26 butStart.setOnClickListener(new View.OnClickListener() { 27 @Override 28 public void onClick(View v) { 29 handler.post(runnable); 30 } 31 }); 32 butStop.setOnClickListener(new View.OnClickListener() { 33 @Override 34 public void onClick(View v) { 35 handler.removeCallbacks(runnable); 36 } 37 }); 38 } 39 Runnable runnable=new Runnable(){ 40 41 @Override 42 public void run() { 43 tv.setText(String.valueOf(i++)); 44 handler.postDelayed(runnable, 1000); 45 } 46 }; 47 }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-02-23
非常好,另外我想问下 这样写。性能怎么样?removeCallbacks是属于打断线程还是??
|
|
返回顶楼 | |
发表时间:2011-02-23
ak121077313 写道 非常好,另外我想问下 这样写。性能怎么样?removeCallbacks是属于打断线程还是?? 这个例子时为了演示handler调用runnable。removeCallbacks的作用是将在消息队列中指定的还未执行的元素删除。在本例中就是将runnable从消息队列中删除 |
|
返回顶楼 | |
发表时间:2011-02-23
据我所知,settext会自动调用invaildate方法,会重新执行ondraw函数,不存在不会改变值的问题
|
|
返回顶楼 | |
发表时间:2011-02-24
是不需要调用invaildate,但是更新ui需要在主线程里面
|
|
返回顶楼 | |
发表时间:2011-02-24
zhy20045923 写道 据我所知,settext会自动调用invaildate方法,会重新执行ondraw函数,不存在不会改变值的问题
朋友,你可以自己写一个demo,然后再另外一个线程中来改变ui,然后看看有没有反应。实践是检验真理的唯一标准 |
|
返回顶楼 | |
发表时间:2011-02-25
Handler默认是主线程的。如果你用HandlerThread新开一个Handler线程,还是要受到“线程间不能互相访问”的限制。
更新UI还是用AsycnTask更加简单漂亮 |
|
返回顶楼 | |