Handler总结常用方法及常见问题
2015-07-27 14:18
260 查看
先庆祝一下终于放假啦,要升大三啦,痛苦的期末考试过去啦。。。。。
一、handler可以发送Message对象和Runnable对象到线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
下面上示例代码:
布局很简单,就一个textView,这就不上啦。
这个代码里包含了一些比较偏(自我感觉)的用法:
runOnUiThread(new Runnable())
textView.post(new Runnable())
二、需注意的问题:
在一个Thread中(除主线程之外)创建Handler时,必须引用Looper,否则会出现这个错误:
Can’t create handler inside thread that has not called Looper.prepare()
另外如果是自己给Thread创建Looper时,可能会遇到这个问题:
java.lang.NullPointerException
这是由于一个时间的问题,可以用下面这个方法避免:
另转发请注明出处:
http://blog.csdn.net/jycboy?viewmode=contents
一、handler可以发送Message对象和Runnable对象到线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
Handler中分发消息的一些方法 post(Runnable) postAtTime(Runnable,long) postDelayed(Runnable long) sendEmptyMessage(int) sendMessage(Message) sendMessageAtTime(Message,long) sendMessageDelayed(Message,long) 以上post类方法是先把Runnable封装成一个Message(具体可看源码),再发送到消息队列中 sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新
下面上示例代码:
package com.example.handler_03; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class MainActivity extends Activity { private TextView textView; private Handler handler=new Handler(){ public void handleMessage(android.os.Message msg) { textView.setText("ok 帅哥"); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView=(TextView) findViewById(R.id.textview); new Thread(){ public void run() { // textView.setText("ok 帅哥"); //Handler handler = new Handler();// Can't create handler inside thread that has not called Looper.prepare() //和我想的一样,yes try { Thread.sleep(2000); //update2(); //updateUI(); viewUI(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }; }.start(); } private void update1(){ handler.post(new Runnable() { //发送到到handler关联的线程 public void run() { textView.setText("ok 帅哥"); } }); } private void update2(){ handler.sendEmptyMessage(1); } private void updateUI(){ runOnUiThread(new Runnable() { //实质一样,利用主线程handler.post(r),发送到住线程中 public void run() { textView.setText("ok 帅哥"); } }); } private void viewUI(){ textView.post(new Runnable() { public void run() { textView.setText("ok 帅哥"); //实质和runOnUiThread方法一样 } }); } }
布局很简单,就一个textView,这就不上啦。
这个代码里包含了一些比较偏(自我感觉)的用法:
runOnUiThread(new Runnable())
textView.post(new Runnable())
二、需注意的问题:
在一个Thread中(除主线程之外)创建Handler时,必须引用Looper,否则会出现这个错误:
Can’t create handler inside thread that has not called Looper.prepare()
另外如果是自己给Thread创建Looper时,可能会遇到这个问题:
java.lang.NullPointerException
这是由于一个时间的问题,可以用下面这个方法避免:
private HandlerThread handlerThread = new HandlerThread("handler thread"); handlerThread.start(); handler = new Handler(handlerThread.getLooper()){//现成的Looper @Override public void handleMessage(Message msg) { System.out.println("currentThread->"+Thread.currentThread()); } };
另转发请注明出处:
http://blog.csdn.net/jycboy?viewmode=contents
相关文章推荐
- Eclipse中关联android sdk源码
- 前端面试题,不解释...
- css content 如何自定义生成图标?
- STL 常见操作
- Mathematica在线性规划中的应用实例
- AM335x uboot 移植
- Sybase ASE 查询当前版本和所有数据库
- Android源码——安卓聊天
- 图像分割(大律法 OSTU法)
- Spark Streaming 流计算优化记录(4)-时间都去哪儿了,关于调度与空转
- CentOS7安装cuda7
- 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(7月23日)
- iOS UITableView的使用 (选自oschina)
- This assembly may have been downloaded from the Web. ......
- The Unique MST----poj1679次小生成树
- 快递业
- Tomcat启动过程
- 工具库
- uva 10098 Generating Fast(全排列)
- eclipse转码插件详解