Android高级应用之Handler(一)
2012-12-10 16:13
337 查看
问题:如何实现每隔5s钟更新一下标题。
学过Java多线程的同学,肯定会想,这还不简单!于是乎有了以下的代码:public class MainActivity extends Activity { private int count = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new TitleThread()).start(); } class TitleThread implements Runnable { @Override public void run() { while (true) { setTitle("Welcome to my blog" + count++); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
赶紧兴致勃勃的运行,可是运行时会报错:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
这个错误究竟是什么东东?
翻译过来的意思是:只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)。也就是说必须在一般必须在程序的主线程(也就是ui)线程中进行更新界面显示的工作。
/article/4386145.html 这篇文章有详细的说明
总结一下:试图在自定义的线程中更新视图(如本例我们是不断的刷新标题)是无法做到的,Android引入了Handler这个特殊类,它架起了Runnable和Activity之间的桥梁。
Handler
在线程的run方法里发送Message,而在Handler里,根据不同的Message执行不同的任务。public class MainActivity extends Activity { private int count = 1; private Handler handler=new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: updateTitle(); break; default: break; } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new TitleThread()).start(); } protected void updateTitle() { setTitle("Welcome to my blog" + count++); } class TitleThread implements Runnable { @Override public void run() { while (true) { Message message=new Message();//创建一条消息 message.what=1;//编码指定 handler.sendMessage(message); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
对于线程的创建也可以采用Timer这个类结合TimerTask来实现
public class TimerActivity extends Activity { private int count = 1; private Handler handler=new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: updateTitle(); break; default: break; } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Timer timer=new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { Message message=new Message(); message.what=1; handler.sendMessage(message); } }, 1000,5000); } protected void updateTitle() { setTitle("Welcome to my blog" + count++); } }
相关文章推荐
- Android高级应用开发第三章---Handler
- Android中checkBox的高级应用---button属性
- Android中JNI高级应用 - 本地C代码中创建Java对象及本地JNI对象的保存 .
- 【Android】Handler应用(二):从服务器端加载JSON数据的优化
- Android开发:Handler Runnable和Thread之间的区别和联系 应用--------------------看完本篇,从此一览无余!
- Android进阶——Handler的实际应用与多线程和界面的四种交互方式
- Android应用开发—Android 消息处理机制:Handler&Message
- Android 中级应用 handler 之二 初试handler
- 【Android高级】查看手机及应用内存状况的方法
- Android应用界面开发——Handler(实现倒计时)
- android应用开发-------------应用崩溃全局异常捕获处理(UncaughtExceptionHandler)
- Android高级开发第一讲--如何在Android应用中避免内存溢出OOM问题
- [高级]Android Launcher研究(三)-----------列出所安装的应用,点击进入相应的应用!
- Android 应用软件开发(十)Handler使用
- Android:异步处理之Handler+Thread的应用(一)
- Android高级应用之 换肤 换主题 主题管理
- Android中的Handler的应用
- 【Android】Handler的应用(一):从服务器端加载JSON数据
- 【Android高级】应用开发必需要掌握的框架<Volley>
- Android开发之TextView高级应用