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 ...
随机推荐
- Entity Framework应用:管理并发
理解并发 并发管理解决的是允许多个实体同时更新,实际上这意味着允许多个用户同时在相同的数据上执行多个数据库操作.并发是在一个数据库上管理多个操作的一种方式,同时遵守了数据库操作的ACID属性(原子性. ...
- [R语言统计]频数表
频数表在统计学中是一个非常基本并且重要的概念,我们这里就来讲解它的基本用法. 首先我们需要载入数据,并查看数据的基本信息 install.packages('vcd') #安装vcd包,其中有可以利用 ...
- [Eclipse] 项目编码
一.修改eclipse的新建项目的编码 在菜单栏的 Window->Preferences->General->Workspace->Text file encoding 将其 ...
- (一) Qt Model/View 的简单说明
(一) Qt Model/View 的简单说明 .预定义模型 (二)使用预定义模型 QstringListModel例子 (三)使用预定义模型QDirModel的例子 (四)Qt实现自定义模型基于QA ...
- 关于PHP开发所需要的工具和环境
0.notepad++ 一个类型记事本的软件,用来看安装的部署说明命令. 1.虚拟机 在虚拟机里面操作,本机不会被影响. 2.CentOS系统 类似Linux的系统,在里面安装PHP,Nginx,ph ...
- 第三百一十九节,Django框架,文件上传
第三百一十九节,Django框架,文件上传 1.自定义上传[推荐] 请求对象.FILES.get()获取上传文件的对象上传对象.name获取上传文件名称上传对象.chunks()获取上传数据包,字节码 ...
- Mysql中Innodb大量插入数据时SQL语句的优化
innodb优化后,29小时入库1300万条数据 参考:http://blog.51yip.com/mysql/1369.html 对于Myisam类型的表,可以通过以下方式快速的导入大量的数据: A ...
- Spring-bean的作用域
在大多数情况下,单例bean是很理想的方案.初始化和垃圾回收对象实例所带来的的成本只留给一些小规模任务,在这些任务中,让对象保持无状态并且在应用中反复重用这些对象可能并不合理.在这种情况下,将clas ...
- localhost 和 127.0.0.1
转自:http://ordinarysky.cn/?p=431localhost与127.0.0.1的区别是什么?相信有人会说是本地ip,曾有人说,用127.0.0.1比localhost好,可以减少 ...
- Oracle 之 SQL 面试题 录
多上网查查 SQL 面试题 1.学号(自动编号) 姓名 性别 年龄 0001 xw 男 18 0002 mc 女 16 0003 ww 男 21 0004 xw 男 18 请写出实现如下 ...