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 ...
 
随机推荐
- hBase官方文档以及HBase基础操作封装类
			
HBase 官方文档 0.97 http://abloz.com/hbase/book.html HBase基本操作封装类(以课堂爬虫为例) package cn.crxy.spider.utils; ...
 - selenium测试(Java)-- 一组元素操作(十一)
			
利用下面的例子来编写测试脚本 页面代码: <!DOCTYPE html> <html> <head> <meta http-equiv="conte ...
 - wamp5多站点配置教程
			
wamp5多站点配置教程 第一要做的是安装第二个apache服务一.找到Apache2的htppd.conf文件.例如:我的wamp是安装在G盘的,我的就是G:\wamp\Apache2\conf目录 ...
 - e670. 缓冲图像转换为图像
			
// This method returns an Image object from a buffered image public static Image toImage(BufferedIma ...
 - C# 发邮件  服务器响应为: 5.7.0 Must issue a STARTTLS command first
			
The SMTP server requires a secure connection or the client was not authenticated. The server respons ...
 - 说说自己对hibernate一级、二级、查询、缓存的理解。
			
说说自己对hibernate一级.二级.查询.缓存的理解. 2016-03-14 21:36 421人阅读 评论(0) 收藏 举报 分类: web开发(19) 版权声明:本文为博主原创文章,未经博 ...
 - 转载: erlang连接mysql
			
转自:http://blog.csdn.net/flyinmind/article/details/7740540 项目中用到erlang,同时也用到mysql.惯例,google. 但是,按照网上说 ...
 - memcached +mysql+php 例子
			
<?php header("content-type:text/html;charset=utf-8"); $memcachehost = '127.0.0.1'; $mem ...
 - ubuntu-12.04.5-desktop-amd64.iso:ubuntu-12.04.5-desktop-amd64:安装Oracle11gR2
			
ubuntu 桌面版的安装不介绍. 如何安装oracle:核心步骤和关键点. ln -sf /bin/bash /bin/sh ln -sf /usr/bin/basename /bin/basena ...
 - nginx 杂谈
			
http://blog.sina.com.cn/s/articlelist_1834459124_0_1.html