老罗Looper(23)例子讲述Looper与Message,线程和Handler关系
2016-03-18 23:20
453 查看
package com.example.handler3; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private Button mButton; private TextView mTextView; private MyHandler mHandler; //子线程发送消息,主线程更新UI private class MyRunnable implements Runnable{ @Override public void run() { Message msg = Message.obtain(); msg.what = 3; msg.obj = "xiaoxi"; mHandler.sendMessage(msg); } } private class MyHandler extends Handler{ //空的构造方法 public MyHandler(){ } //构造方法 public MyHandler (Looper loop){ super(loop); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); mTextView.setText("接受消息" + msg.obj); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button)findViewById(R.id.button1); mTextView = (TextView)this.findViewById(R.id.textView1); //Activity中有系统Looper对象来处理线程中发送的消息,一下两段写不写都行 // Looper l = Looper.myLooper(); // mHandler = new MyHandler(l); mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { MyRunnable r = new MyRunnable(); Thread t = new Thread(r); t.start(); } }); } }
验证Activity中有系统Looper对象来处理线程中发送的消息
error代码
package com.example.handler3; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private Button mButton; private TextView mTextView; private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button)findViewById(R.id.button1); mTextView = (TextView)this.findViewById(R.id.textView1); //启动线程 new Thread(new MyRunnable()).start(); //Activity中有系统Looper对象来处理线程中发送的消息,一下两段写不写都行 mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Message msg = Message.obtain(); msg.obj = "xiaoxi"; mHandler.sendMessage(msg); } }); } private class MyRunnable implements Runnable{ @Override public void run() { mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); System.out.println("接收到消息:" + msg.obj); } }; } } }
java.lang.RuntimeException: Can’t create handler inside thread that has not called Looper.prepare()
error原因,线程默认是与Message loop无关联的。
正确写法:
package com.example.handler3; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private Button mButton; private TextView mTextView; private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button)findViewById(R.id.button1); mTextView = (TextView)this.findViewById(R.id.textView1); //启动线程 new Thread(new MyRunnable()).start(); //Activity UI主线程中有系统Looper对象来处理线程中发送的消息,一下两段写不写都行 mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Message msg = Message.obtain(); msg.obj = "xiaoxi"; mHandler.sendMessage(msg); } }); } private class MyRunnable implements Runnable{ @Override public void run() { //在子线程实例化handler,子线程中没有Looper对象来处理线程中发送的消息 Looper.prepare();//循环消息队列 mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); System.out.println("接收到消息:" + msg.obj); } }; Looper.loop();//直到消息队列循环结束 } } }
相关文章推荐
- Linux内存管理之mmap详解
- 监听滚动window.onscroll scrlltop被卷去的头部
- CopyOnWrite容器
- 基于Centos6.X系列的LNMP环境搭建
- tomcat datasource
- JMS-OpenJMS提供商
- 使用openpyxl修改Excel文件,日期累加写入
- 【小白学OpenCV】(1): 图像处理之低通滤波
- error: option --single-version-externally-managed not recognized
- 学习OpenCV2——Mat之通道的理解
- NanoPC-T2 uboot分析(1)
- 关于openStream方法和openConnection方法的区别
- Linux内核分析学习笔记(一)
- Linux内核设计第四周——扒开系统调用三层皮
- STM32canopen调试
- linux下归档
- Linux下管理用户的命令大全
- nginx
- linux系统下重启tomcat的shell脚本
- Linux编程-让进程或线程运行在指定的CPU上