实例讲解Android多线程应用开发中Handler的使用

其实可以理解Handler为主线程和另外的线程之间进行数据更新的东东,并且Handler在主线程中,并在Handler直接调用线程的run方法

package com.Handler02; import android.app.Activity; import android.os.Bundle; import android.os.Handler; public class Handler02Activity extends Activity { /** Called when the activity is first created. */ private Handler handler=new Handler(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler.post(thread1); setContentView(R.layout.main); System.out.println("================Main==============="+Thread.currentThread().getId()); System.out.println("============Main========="+Thread.currentThread().getName()); } Runnable thread1=new Runnable() { @Override public void run() { System.out.println("======thread1==============="+Thread.currentThread().getId()); System.out.println("========thread1============"+Thread.currentThread().getName()); try { Thread.sleep(10000); } catch (Exception e) { // TODO: handle exception } } }; }

结果是主线程等待10s后才显示出来,并且线程ID

package com.Handler4; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.TextView; public class Handler4Activity extends Activity { /** Called when the activity is first created. */ private TextView textView; private MyHandler myHandler=new MyHandler(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView=(TextView)this.findViewById(R.id.textView1); } class MyHandler extends Handler{ //从消息队列中取出并handleMessage处理消息 @Override public void handleMessage(Message msg) { textView.setText((String)msg.obj); } } public void download(View view){ Thread thread=new Thread(new Runnable() { @Override public void run() { try { String s="zhangzhao"; Thread.sleep(5000); //数据发送出来 //textView.setText(s); Message message=Message.obtain();//最好不要new,这个obtain会节省资源 message.obj=s; myHandler.sendMessage(message);//没有指定looper那么就会发送给主线程中的looper } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); thread.start();//会出错原因是在非UI线程里面直接操作UI //主线程维护了一个消息对列,当其他的线程有数据需要传递给主线程的时候,你就把数据封装成一个Message对象,然后放在主线程的 //消息队列中去,对应消息的处理由Looper,子线程通过Handler把下载完的数据封装到Message里面,然后把消息取出来交给Handler进行处理 //通过Handle和Message实现两个线程之间达到共享数据 } } package com.Handler5; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; public class Handler5Activity extends Activity { /** Called when the activity is first created. */ private ProgressBar progressBar; private Button button; private TextView textView; private MyHandler myHandler=new MyHandler(); int i=0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); progressBar = (ProgressBar)this.findViewById(R.id.progressBar1); textView=(TextView)this.findViewById(R.id.textView1); } class MyHandler extends Handler{ @Override public void handleMessage(Message msg) { int pos =(Integer)msg.obj; progressBar.setProgress(pos); textView.setText(pos+"%"); } } public void downLoad(View view){ new Thread(new Runnable() { @Override public void run() { while(i<=100){ try { Thread.sleep(300); i+=10; Message message=Message.obtain(); message.obj=i; myHandler.sendMessage(message); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); } }

效果:

时间: 2024-10-03 15:48:02

实例讲解Android多线程应用开发中Handler的使用的相关文章

实例讲解Android多线程应用开发中Handler的使用_Android

其实可以理解Handler为主线程和另外的线程之间进行数据更新的东东,并且Handler在主线程中,并在Handler直接调用线程的run方法 package com.Handler02; import android.app.Activity; import android.os.Bundle; import android.os.Handler; public class Handler02Activity extends Activity { /** Called when the act

通过实例讲解如何在OSGi应用中使用EJB技术

使用 WAS V8.5 的 OSGi 功能,不仅能够将已有的 EJB 模块转化为以 OSGi Bundle 为单位的 OSGi 应用,也可以结合 Rational Development 工具直接开发基于 EJB 的 OSGi 应用.在本文中,我们首先介绍 WAS V8.5 在 OSGi 编程方面的增强,然后通过实例讲解如何在 OSGi 应用中使用 EJB 技术. WebSphere Application Server V8.5 对 OSGi 一个最重要的增强就是提供了对 EJB3.x 的支持

android 应用程序开发中,清除缓存的功能怎么做啊?

问题描述 android 应用程序开发中,清除缓存的功能怎么做啊? android 应用程序开发中,清除缓存的功能怎么做啊?清除此应用程序的缓存,怎么做? 解决方案 getCacheDir()能够得到当前项目的缓存地址 在项目中经常会使用到WebView 控件,当加载html 页面时,会在/data/data/应用package 目录下生成database与cache 两个文件夹.请求的url 记录是保存在WebViewCache.db,而url 的内容是保存在WebViewCache 文件夹下

实例讲解Android应用中自定义组合控件的方法_Android

自定义view大概可以分成: 继承view 组合view 自己画的view(用paint和canvas) 自定义viewgroup(widget) 最近又跟同学聊起来了,于是就准备自己实现一个imagebutton来练练手.(最简单的了)以及后面一个把imageview与textview结合使用的案例. ImageButton要实现ImageButton最容易想到的不就是把button和imageview合在一起么.嗯,人容易就想到这是一个组合自定义view.可是如何把一个image放到butt

实例讲解Android中的AIDL内部进程通信接口使用_Android

首先描述下我们想要实现的内容,我们希望在一个应用中通过点击按钮,去操作另一个进程中应用的音乐播放功能. 如图,我们点击"播放"时,系统就会去远程调用我们提供的一个service(与当前service不是同一个应用哦),然后操作service中的音乐播放,点击"停止"则会终止播放.想要重新播放的话,必须先点"销毁service",再点播放按钮哦.(至于这里为什么要先点销毁按钮才能播放,完全是为了给大家展示下,远程调用service时,怎么去解绑se

实例讲解Android App使用自带的SQLite数据库的基本方法_Android

SQLite数据库是android系统内嵌的数据库,小巧强大,能够满足大多数SQL语句的处理工作,而SQLite数据库仅仅是个文件而已.虽然SQLite的有点很多,但并不是如同PC端的mysql般强大,而且android系统中不允许通过JDBC操作远程数据库,所以只能通过webservice等手段于php.servlet交互获取数据. 基础SQLiteDatabase类,代表了一个数据库对象,通过SQLiteDatabase来操作管理数据库. 一些基本的用法:   static  SQLiteD

实例讲解Java的设计模式编程中责任链模式的运用_java

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.类型:行为类模式类图: 首先来看一段代码: public void test(int i, Request request){ if(i==1){ Handler1.response(request); }else if(i == 2){ Handler2.response(request); }else if(i == 3){ Handler3.r

实例讲解Android App使用自带的SQLite数据库的基本方法

SQLite数据库是android系统内嵌的数据库,小巧强大,能够满足大多数SQL语句的处理工作,而SQLite数据库仅仅是个文件而已.虽然SQLite的有点很多,但并不是如同PC端的mysql般强大,而且android系统中不允许通过JDBC操作远程数据库,所以只能通过webservice等手段于php.servlet交互获取数据. 基础 SQLiteDatabase类,代表了一个数据库对象,通过SQLiteDatabase来操作管理数据库. 一些基本的用法: static  SQLiteDa

多线程-Delphi开发中遇到的内存错误问题

问题描述 Delphi开发中遇到的内存错误问题 #背景介绍 我做了一个模拟的dll,模拟原来的发送消息的dll,实现的功能是将消息(XML)解包写到DBF中 多线程环境 #同样的代码,有以下两种情况 没有使用断点调试的时候,运行到发送(也就是写到DBF)的时候就会报地址错误(这一步是通过记录日志信息确定在哪一步报错的),但是线程还是继续执行,不过每次运行到发送的时候就报错 但是如果使用断点调试的话,跟踪断点到发送函数的时候就没有报错,从来也不报错 这个问题我实在是没有思路,希望有经验的前辈能指点