Android Thread Handler UIHandler demos
extends:http://blog.csdn.net/superjunjin/article/details/7540064
序效果:为了显示如何用message传值的简单例子
例1,点击按钮,持续显示当前系统时间(bundle传值,耗时,效率低)
例2,点击按钮,progressbar持续前进(message方法传值,效率高,但只能传整型int和对象object)
例1,主activity
package com.song; import java.text.SimpleDateFormat;
import java.util.Date; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView; public class C91_HandlerActivity extends Activity {
/** Called when the activity is first created. */
TextView textview;
Button button;
MyThread mythread;
Thread thread;
MyHandler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textview=(TextView)findViewById(R.id.textview);
button=(Button)findViewById(R.id.button);
handler=new MyHandler();
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
mythread=new MyThread();
thread=new Thread(mythread);
thread.start();
}
});
}
class MyHandler extends Handler
{
//接受message的信息
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if(msg.what==1)
{
textview.setText(msg.getData().getString("time"));
} }
}
class MyThread implements Runnable
{ @Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
try {
Thread.sleep(1000);
String time=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date());
System.out.println(time);
Message message=new Message();
Bundle bundle=new Bundle();
bundle.putString("time", time);
message.setData(bundle);//bundle传值,耗时,效率低
handler.sendMessage(message);//发送message信息
message.what=1;//标志是哪个线程传数据
//message有四个传值方法,
//两个传int整型数据的方法message.arg1,message.arg2
//一个传对象数据的方法message.obj
//一个bandle传值方法 } catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="开始"
android:id="@+id/button"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
android:textStyle="bold"
android:id="@+id/textview"/> </LinearLayout>
例2,主activity
package com.song; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar; public class C92_Handler2Activity extends Activity {
/** Called when the activity is first created. */
Button button;
ProgressBar bar;
MyThread mythread;
Thread thread;
MyHandler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button=(Button)findViewById(R.id.button);
bar=(ProgressBar)findViewById(R.id.bar);
handler=new MyHandler();
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
mythread=new MyThread();
thread=new Thread(mythread);
thread.start();
}
});
}
class MyHandler extends Handler
{
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if(msg.what==1)
{
System.out.println(msg.arg1+"handle");
bar.setProgress(msg.arg1);
}
}
} class MyThread implements Runnable
{
int pro=0;
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
try {
Thread.sleep(1000);
pro=bar.getProgress()+1;
bar.setProgress(pro);
System.out.println(pro+"thread");
Message message=new Message();
message.arg1=pro;
message.what=1;
handler.sendMessage(message); } catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
} } }
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/button"
android:text="开始"
/>
<ProgressBar android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/bar"
style="@android:style/Widget.ProgressBar.Horizontal"
/> </LinearLayout>
显示效果

、
-------------------------------------------------------------
extends:http://blog.csdn.net/shenyuemei/article/details/11030679
在工作线程中处理UI线程报错:Only the original thread that created a view hierarchy can touch its views.
如果将更新UI控件的代码写入到工作线程中便会报错,
Runnable socketRun = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
tv = (TextView) findViewById(R.id.tv);
Socket socket = null;
String message = et.getText().toString() + "\r\n";
try {
// 创建socket
socket = new Socket("192.168.1.34", 8080);
// 向服务器发送消息
PrintWriter out = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()), true);
out.println(message);
// 接收来自服务器的消息
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
msgs = br.readLine();
//下面是更新UI的代码,这样写是错误的
if (msgs != null) {
tv.setText(msgs);
} else {
tv.setText("数据错误!");
}
out.close();
br.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
错误如下:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
因为这样会阻塞住线程。
有一下三种改法:
第一种:利用Message来传递信息给Handler来处理UI的更新问题
Runnable socketRun = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
tv = (TextView) findViewById(R.id.tv);
Socket socket = null;
String message = et.getText().toString() + "\r\n";
try {
// 创建socket
socket = new Socket("192.168.1.34", 8080);
// 向服务器发送消息
PrintWriter out = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()), true);
out.println(message);
// 接收来自服务器的消息
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
msgs = br.readLine();
<span style="color:#000000;">//实例化message对象
Message msg = new Message();
//给message对象赋值
msg.what = 1;
//发送message值给Handler接收
mHandler.sendMessage(msg);
</span> out.close();
br.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
<span style="color:#000000;">private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
// 更新UI
switch (msg.what) {
case 1:
if (msgs != null) {
tv.setText(msgs);
} else {
tv.setText("数据错误!");
}
break;
}
};
};</span>
第二种:利用Handler的post方法
Runnable socketRun = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
tv = (TextView) findViewById(R.id.tv);
Socket socket = null;
String message = et.getText().toString() + "\r\n";
try {
// 创建socket
socket = new Socket("192.168.1.34", 8080);
// 向服务器发送消息
PrintWriter out = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()), true);
out.println(message);
// 接收来自服务器的消息
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
msgs = br.readLine();
<span style="color:#000000;">mHandler.post(updateThread);
</span>
out.close();
br.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
<span style="color:#000000;">private Handler mHandler = new Handler();
Runnable updateThread = new Runnable()
{
@Override
public void run()
{
//更新UI
if (msgs != null) {
tv.setText(msgs);
} else {
tv.setText("数据错误!");
}
}
};</span>
第三种方法:官方推荐的方法
Android Thread Handler UIHandler demos的更多相关文章
- Android中Handler 、Thread和Runnable之间的关系
在多线程编程的时候,我们经常会用到Handler,Thread和Runnable这三个类,我们来看看这三个类之间是怎么样的关系? 首先说明Android的CPU分配的最小单元是线程,Handler一般 ...
- Android 中Thread,Handler,Loop学习
1.先看一下最简单的进度条示例 EG: package com.sxz.android.thread; import java.util.concurrent.atomic.AtomicBoolean ...
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍 ...
- ANDROID_MARS学习笔记_S04_009_用java.lang.ref.SoftReference作缓存,android.os.Handler和new Thread异步加载略图片
一.简介 二.代码流程 1.private Map<String, SoftReference<Drawable>> imageCache = new HashMap<S ...
- Android开发Thread+Handler演示样本(打地鼠)
直接在代码 package com.mingrisoft; import java.util.Random; import android.app.Activity; import android.o ...
- Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面
目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...
- W/MessageQueue: Handler (android.os.Handler) {4241f8f8} sending message to a Handler on a dead thread
缩略信息是: sending message to a Handler on a dead thread 我是用IntentService时报的 稍微纤细一点儿的信息是: Handler (andro ...
- Android 异步更新UI----handler+thread
android应用是单线程模式的. 单线程模式需要记住两条: 一.防止UI线程阻塞 二.确保只在UI线程中访问Android UI工具包 在开发Android应用时必须遵守单线程模型的原则:Andro ...
- Android的Handler机制
Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...
随机推荐
- Uncaught (in promise) Provided element is not within a Document
今天在使用html2canvas生成海报的时候,发现报了个如下图所示的错误: 发生这个错误的本质原因是在调用html2canvas的时候传递的是jQuery对象,而不是DOM原生对象. 开始的时候我是 ...
- android EditText设置光标、边框和图标,以及限制输入
控制边框形状,先在drawable中建一个xml文件:shape.xml <?xml version="1.0" encoding="utf-8"?> ...
- Hive SQL执行流程分析
转自 http://www.tuicool.com/articles/qyUzQj 最近在研究Impala,还是先回顾下Hive的SQL执行流程吧. Hive有三种用户接口: cli (Command ...
- wex5中集成的mysql数据库 打开时一闪而过 报错
在进程中kill mysql.exe 重新启动即可
- vs2008 x64编译环境 忽略了 #ifdef WIN32
解决方法: 右键项目属性,在预处理器中添加WIN32即可 效果:
- (转)V4L2 Video overlay, Video output, Video output overlay的区别
原文地址:http://blog.csdn.net/kickxxx/article/details/7755127 三者都是V4L2定义的接口,英文原文参见 http://v4l2spec.bytes ...
- 【AngularJS】AngularJS整合Springmvc、Mybatis环境搭建
近期想学习AngularJS的使用,网上搜了一圈后,折腾了半天解决bug后,成功使用AngularJS整合Springmvc.Spring.Mybatis搭建了一个开发环境.(这里Spring使用的版 ...
- R语言中两个数组(或向量)的外积怎样计算
所谓数组(或向量)a和b的外积,指的是a的每个元素和b的每个元素搭配在一起相乘得到的新元素.当然运算规则也可自己定义.外积运算符为 %o%(注意:百分号中间的字母是小写的字母o).比如: > a ...
- [mysql] 查询前几条记录
From: http://www.cnblogs.com/xuxm2007/archive/2010/11/16/1878211.html SELECT * FROM table LI ...
- js实现密码强度
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...