Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 589|回复: 0

Android HandlerThread类,Bundle的使用-  Android学习

[复制链接]

该用户从未签到

发表于 2011-10-24 14:38:48 | 显示全部楼层 |阅读模式
1、其实上面的方法,直接使用handler.post(updateThread),然后线程updateThread直接调用run()方法,并没有调用start()方法, 所以并没有产生新的线程,都是在主线程里面运行的

2、要产生新的线程,可以用如下方法:
java代码

//生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由Android应用程序框架提供

HandlerThread handlerThread = new HandlerThread("handler_thread");

//必须先调用该类的start();

handlerThread.start();
复制代码



这样就产生了新的线程,然后可以继承Handler类,生成Handler对象,来控制线程


3、Bundle是键值对,键为string类型,值可以为多种类型,用于Message的setData()中存储数据的,加入数据如下
Java代码
Bundle b = new Bundle();

b.putInt("age", 20);

b.putString("name", "Jhon");
复制代码



Java代码 package mars.handler;



import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.HandlerThread;

import android.os.Looper;

import android.os.Message;



public class HandlerTest2 extends Activity {



@Override

protected void onCreate(Bundle savedInstanceState) {



  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);



  HandlerThread handlerThread = new HandlerThread("handler_thread");

  handlerThread.start();



  MyHandler myHandler = new MyHandler(handlerThread.getLooper());

  Message msg = myHandler.obtainMessage();



  Bundle b = new Bundle();

  b.putInt("age", 20);

  b.putString("name", "Jhon");

  msg.setData(b);

  msg.sendToTarget();

}



//继承Handler类,

class MyHandler extends Handler{

  public MyHandler(Looper looper){

   super(looper);

  }

  @Override

  public void handleMessage(Message msg) {

   Bundle b = msg.getData();

   int age = b.getInt("age");

   String name = b.getString("name");

   System.out.println("age is " + age + ", name is" + name);



  }

}

}
复制代码
此代码在实际运行的过程虽然没有问题,但是如果是想在void handleMessage()方法里刷新
View和控件会报如下错误:
Java代码
...nly the original thread that created a view hierarchy can touch its views.
复制代码



这主要是Android的相关View和控件不是线程安全的,我们必须做独立的处理。这里Android给 我们提供了很多方法,今天android开发网说一种简单的方法除了异步任务AsyncTask外使 用Handler可以很好的处理,和Win32的消息很像。

首先我们需要明白,主线程或者这里说的原始线程original thread 一般情况下是UI线程,当然UI线程并不一定是主线程,我们不能长时间的阻塞该应用,在Android平台上可能会产生类似Force close或Wait这样的对话框这里我们成为ANR,这里除了使用ProgressDialog方式给用一个动态的进度代表当前处理并没有中断可能需要 一些时间,所以告诉大家相关的网络处理可以使用工作者线程,但是worker 线程不能处理显示元素即UI相关的View或 Widget包中的高层的控件,所以通过一个Handler对象可以很好的传递Runnable或Message ,下面我们用一个简单的例子来描述
Java代码
final Handler handler = new Handler();

new Thread() {

        public void run() {

                // list = getData();        //处理得到结果了,这里一些内容保存在主类的成员变量中

                handler.post(new Runnable() {

                        public void run() {

                                //这里就可以获得主类中的组件刷新

                                gallery = (Gallery) findViewById(R.id.galley);

                                gallery.setAdapter(new ImageAdapter(MainActivity.this,

                                                listData));

                                getLoading().dismiss();

                        }

                }); // 高速UI线程可以更新结果了

        }

}.start();
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 12:02 , Processed in 0.295958 second(s), 35 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表