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的更多相关文章

  1. Android中Handler 、Thread和Runnable之间的关系

    在多线程编程的时候,我们经常会用到Handler,Thread和Runnable这三个类,我们来看看这三个类之间是怎么样的关系? 首先说明Android的CPU分配的最小单元是线程,Handler一般 ...

  2. Android 中Thread,Handler,Loop学习

    1.先看一下最简单的进度条示例 EG: package com.sxz.android.thread; import java.util.concurrent.atomic.AtomicBoolean ...

  3. Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍 ...

  4. ANDROID_MARS学习笔记_S04_009_用java.lang.ref.SoftReference作缓存,android.os.Handler和new Thread异步加载略图片

    一.简介 二.代码流程 1.private Map<String, SoftReference<Drawable>> imageCache = new HashMap<S ...

  5. Android开发Thread+Handler演示样本(打地鼠)

    直接在代码 package com.mingrisoft; import java.util.Random; import android.app.Activity; import android.o ...

  6. Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面

    目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...

  7. 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 ...

  8. Android 异步更新UI----handler+thread

    android应用是单线程模式的. 单线程模式需要记住两条: 一.防止UI线程阻塞 二.确保只在UI线程中访问Android UI工具包 在开发Android应用时必须遵守单线程模型的原则:Andro ...

  9. Android的Handler机制

    Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...

随机推荐

  1. ElasticSearch0910学习

    1:es简介 es是一个分布式的搜索引擎,使用java开发,底层使用lucene. 特点:天生支持分布式的.为大数据而生的.基于restful接口. 2:es和solr对比 接口 solr:类似web ...

  2. Hive SQL的编译过程

    文章转自:http://tech.meituan.com/hive-sql-to-mapreduce.html Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用.美团数据仓库也是 ...

  3. 【转】【OPenGL】opengl 64位 配置 freeglutx64下载

    1.GLEW The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extension ...

  4. 【转】【C++】C++ 中的线程、锁和条件变量

    线程 类std::thread代表一个可执行线程,使用时必须包含头文件<thread>.std::thread可以和普通函数,匿名函数和仿函数(一个实现了operator()函数的类)一同 ...

  5. 【转】MFC WM_CTLCOLOR 消息

    WM_CTLCOLOR消息用来完成对EDIT, STATIC, BUTTON等控件设置背景和字体颜色, 其用法如下: 1.首先在自己需要设置界面的对话框上点击右键-->建立类向导-->加入 ...

  6. 关于document.createDocumentFragment()(转)

    documentFragment 是一个无父对象的document对象. 他支持以下DOM2方法: appendChild, cloneNode, hasAttributes, hasChildNod ...

  7. jquery -- checkbox选中无选中状态

    最近在工作中使用jquery操作checkbox,使用下面方法进行全选.反选: var ischecked=allCheckObj.is(':checked'); ischecked?checksOb ...

  8. 对sssp项目搭建的补充,总错误处理。

    总错误处理,是为了在程序运行时代码出错能及时在控制台看出错误信息. 1. springMVC配置文件中: -------- 2.controller包中: 新建类FrameControllerAdvi ...

  9. Case用法

    SELECT <myColumnSpec> = CASE WHEN <A> THEN <somethingA> WHEN <B> THEN <so ...

  10. 新版SourceTree免帐号登录安装

    http://blog.csdn.net/zcbyzcb/article/details/72959720?locationNum=2&fps=1 [ { "$id": & ...