- 浏览: 761074 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (139)
- 玩转Android (48)
- Android创意美工 (0)
- Android杂谈 (23)
- Android实例练习 (2)
- Android ROM研究 (5)
- Android NDK开发指南 (5)
- Android NDK (0)
- Android Tips (3)
- Windows Phone 7 (5)
- iPhone (0)
- HTML5学习室 (0)
- JAVA (9)
- SSH+ibatis (8)
- PHP (0)
- IT生活 (1)
- linux (2)
- C (4)
- C++ (1)
- web 前端 (1)
- 云计算 (0)
- 设计模式 (0)
- C# (2)
- 其他 (1)
- 数据结构 (5)
- Web开发 (10)
- 数据库 (3)
- 搜索引擎 (0)
- Go语言 (0)
最新评论
-
wi100sh:
多谢分享~
玩转Android---UI篇---ImageButton(带图标的按钮) -
zhanghaichang:
好文章的。
高性能web开发技术(一) -
yingang:
引用classes.dex.dex2jar.jar 拖入 j ...
Andorid杂谈---Apk文件的反编译 -
扶摇诺:
讲解的简明易懂,多谢啦!
玩转Android---UI篇---LinearLayout(线性布局) -
a13429921973:
更为详细的图文介绍,可参考这个http://blog.csdn ...
Android ROM研究---CyanogenMod源代码下载及编译
对于Handler来说,它和与它调用它的Activity是出于同一线程的,上一篇并没有调用线程
的start方法,而是直接执行的run方法。而启动一个线程是调用的start方法
上一篇博客里的对Handler的调用时通过Runnable接口来实现的,并且是通过run()方法来启动那个线程的,而且是Activity和Handler是两个线程独立运行的,互补干扰,但是实际情况确实,Activity所在的线程和Handler的线程是同一个线程,下面进行一下实验
package org.hualang.handlertest3; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; public class HandlerTest3 extends Activity { private Handler handler = new Handler(); private String TAG = "System.out"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler.post(r); setContentView(R.layout.main); //Thread t = new Thread(r); //t.start(); Log.d(TAG,"Activity id:"+Thread.currentThread().getId()); Log.d(TAG,"Activity name:"+Thread.currentThread().getName()); } Runnable r = new Runnable() { public void run() { Log.d(TAG,"Handler id:"+Thread.currentThread().getId()); Log.d(TAG,"Handler name:"+Thread.currentThread().getName()); try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; }
运行结果:
证明是同一个线程的两个依据:
①Activity的id或name和Handler的id或name是同样的
②我设置了
handler.post(r);
setContentView(R.layout.main);
也就是,如果执行后马上显示文本信息,那么可以证明它们不在同一个线程,但是实际情况是要先执行了handler后5秒,才显示文本信息,说明它们在同一线程
如果将代码改为
//handler.post(r); setContentView(R.layout.main); Thread t = new Thread(r); t.start();
再次执行,运行结果如下,通过start启动线程,它们不在同一个线程中
----------------------------------------------------------------------------------------------------------------
Looper即循环的从队列当中取得消息的功能,如果在线程中使用Looper
那么,就会循环的从线程队列当中取得消息并处理,如果队列当中没有消息的话
,线程就进入了休眠状态
Looper很少自己创建,在Android中给出了HandlerThread类,并且具有循环取得并处理消息的功能
下面来实现这种Activity和Handler分别在两个线程中执行,实现真正的异步处理
package org.hualang.handlertest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.util.Log; public class HandlerTest4 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.d("System.out","Activity所在线程的id:"+Thread.currentThread().getId()); /** * 生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能 * 这个类由Android应用程序框架提供 */ HandlerThread handlerThread = new HandlerThread("handlerThread"); handlerThread.start(); MyHandler handler = new MyHandler(handlerThread.getLooper()); Message msg = handler.obtainMessage(); /** * 将Message对象发送到目标对象 * 所谓的目标对象,就是生成该msg对象的handler对象 */ msg.sendToTarget(); } class MyHandler extends Handler { public MyHandler() { } public MyHandler(Looper looper) { super(looper); } public void handleMessage(Message msg) { Log.d("System.out", "handler所在线程的id:"+Thread.currentThread().getId()); } } }
运行结果:
可以看到,Activity和Handler是在两个不同的线程中执行的,这样就是实现了真正的异步处理
1、首先创建一个HandlerThread对象,这个HandlerThread类实现了循环的取得消息并处理
2、用start方法启动一个新线程
3、创建MyHandler类,里面传递的参数即Looper方法所获得的可以循环在队列中取得的消息
4、MyHandler类调用的是带参数Looper的构造方法,并且实现了handlerMessage方法
5、获取一个Message对象
6、将这个对象发送到生成该msg对象的handler对象,从而执行了handleMessage方法
-----------------------------------------------------------------------------------------------------
最后,将说一下Message里传送的数据的使用,这里的msg对象可以使用arg1,arg2或者obj
arg1 and arg2 are lower-cost alternatives to using setData()
if you only need to store a few integer values. 也就是相对于setData()方法,如果你仅仅保存一些简单的整形数的话,arg1,arg2对资源的要求较低,而setData()方法一般用于传递大量数据的时候会用到
如果是msg.obj,那么可以这样用
msg.obj = "Welcome to china";
然后在handleMessage()方法中用
String str = (String)msg.obj;来获得传递的值
如果使用getData()方法的话,需要用到Bundle对象来传递,下面用个例子来说明
Bundle b = new Bundle(); b.putInt("age", 22); b.putString("name", "loulijun"); msg.setData(b); msg.sendToTarget();
上面的代码用来设置要传递的数据
下面的代码用来获取Bundle传递过来的数据并且用Toast来显示
Bundle b = msg.getData(); int age = b.getInt("age"); String name = b.getString("name"); Toast toast = Toast.makeText(getApplicationContext(), "age="+age+"name="+name, Toast.LENGTH_LONG); toast.show();
package org.hualang.handlertest;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
public class HandlerTest4 extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("System.out","Activity所在线程的id:"+Thread.currentThread().getId());
/**
* 生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能
* 这个类由Android应用程序框架提供
*/
HandlerThread handlerThread = new HandlerThread("handlerThread");
/**
* 使用HandlerThread的getLooper()方法之前,必须先调用该类的start()方法,否则是个null,会报错
*/
handlerThread.start();
MyHandler handler = new MyHandler(handlerThread.getLooper());
Message msg = handler.obtainMessage();
/**
* 将Message对象发送到目标对象
* 所谓的目标对象,就是生成该msg对象的handler对象
*/
//msg.obj = "Hello world";
Bundle b = new Bundle();
b.putInt("age", 22);
b.putString("name", "loulijun");
msg.setData(b);
msg.sendToTarget();
}
class MyHandler extends Handler
{
public MyHandler()
{
}
public MyHandler(Looper looper)
{
super(looper);
}
public void handleMessage(Message msg)
{
//String str = (String)msg.obj
Bundle b = msg.getData();
int age = b.getInt("age");
String name = b.getString("name");
Toast toast = Toast.makeText(getApplicationContext(), "age="+age+"name="+name, Toast.LENGTH_LONG);
toast.show();
Log.d("System.out", "handler所在线程的id:"+Thread.currentThread().getId());
}
}
}
运行结果:
评论
发表评论
-
玩转Android---2D图形及动画---动画分析(Tween详细分析)
2011-09-26 21:59 2628在Android系统中提供了两种动画实现方式:一种是Tween ... -
玩转Android---2D图形及动画---图片处理
2011-09-26 13:08 1781在Android中很多地方都使 ... -
玩转Android--UI篇--PreferenceActivity(开启wifi和音乐等)
2011-09-01 11:57 4852本测试主要是为了测试PreferenceActivity的使用 ... -
玩转Android---2D图形及动画---Gif动画
2011-08-05 09:36 2221由于Gif本身就是动画,所以如果能够直接使用的话,会省去很多的 ... -
玩转Android---2D图形及动画---Frame动画
2011-08-01 20:53 2087Frame动画其实就是逐帧动画,用法也比Tween动画简单,只 ... -
玩转Android---2D图形及动画---Tween动画
2011-07-31 22:53 2180Android平台提供了两类动画,分别是Tween动画,和Fr ... -
玩转Android---2D图形及动画---View类使用
2011-07-30 23:39 2801由于游戏界面是由大量美工资源图片构成的,所以,在设计游戏界面的 ... -
玩转Android--组件篇---Handler的使用
2011-07-30 14:01 5359public class Handler ... -
玩转Android---UI篇---ZoomControls放大缩小图片
2011-07-27 13:03 7249ZoomControls控件是一个可以缩放但控件,效果如下图 ... -
玩转Android---组件篇---TextSwitcher
2011-07-25 09:21 2194还记得有一次淘宝的电话面试的时候问了我一个关于Android的 ... -
玩转Android---组件篇---AnalogClock,DigitalClock
2011-07-10 19:28 2942首先要说的是,这两个控件并不是经常的使用,但是如果程序需要的话 ... -
玩转Android---组件篇---SeekBar,RatingBar,Chronometer
2011-07-10 19:12 2859今天补充三个组件的使用,避免日后忘记。它们分别是 SeekB ... -
玩转Android---组件篇---Handler的使用(1)
2011-05-28 15:37 2175在android中,有很多功能是不能放在onCreate或者o ... -
玩转Android---事件监听篇---第2篇
2011-05-27 10:30 5252事件监听篇---第二篇 下面是各种常用控件的事件监听的 ... -
玩转Android---事件监听篇---第1篇
2011-05-26 21:29 9933事件就是用户与UI界面的交互时所触发的操作。比如点击某一个按钮 ... -
玩转Android---组件篇---数据存储之SQLite
2011-04-17 17:05 8486Android中通过SQLite数据库引擎来实现结构化数据存储 ... -
玩转Android---组件篇---数据存储之File
2011-04-17 11:07 2047我们可以将一些数据直接以文件的形式保存在设备中。例如,一些文本 ... -
玩转Andorid---组件篇---数据存储之preference
2011-04-14 21:58 2304程序是数据的输入、处 ... -
玩转Android---组件篇---Broadcast Receiver(广播接收器)
2011-04-14 19:24 29350Braodcast Receiver顾名思义 ... -
玩转Andorid---组件篇---Service(服务)之RPC远程进程调用
2011-04-08 21:17 3466在Andorid平台中,各个组件运行在自己的进程中,他们 ...
相关推荐
此外,Handler还可以与其他组件(如Service、BroadcastReceiver等)配合使用,实现更复杂的异步通信场景。 在实际开发中,常常结合AsyncTask、IntentService等其他异步处理方式一起使用,以应对各种复杂的线程同步...
本篇文章将深度剖析名为“CatchThePigeonAndroid”的项目,揭示其背后的Android编程原理和技术细节。 一、项目概述 “CatchThePigeonAndroid”项目,顾名思义,很可能是一款基于Android平台的游戏应用,旨在捕捉...
Android应用通常由Activity、Service、BroadcastReceiver、ContentProvider和Intent等组件构成。在这个项目中,Activity将是游戏的主要界面,负责处理用户交互。开发者需要利用Android的布局管理器如LinearLayout、...
对于俄罗斯方块这样的2D游戏,开发者通常会利用Android的SurfaceView或Canvas进行图形绘制,以及 Handler 和 Runnable 结合实现游戏循环。 在这个名为"Android俄罗斯方块游戏源码"的压缩包中,我们可以期待找到以下...
学习使用AsyncTask、Handler、Thread或Runnable等多线程技术,有助于理解源代码的异步处理机制。 7. **数据持久化** 如果源代码包含了保存和加载游戏进度的功能,那么你需要了解SharedPreferences、SQLite数据库或...
这个项目标题“时间 android 自定义时钟”暗示我们将会探讨如何在Android应用中创建一个定制化的时钟组件。下面将详细介绍这个主题。 首先,让我们了解Android中的时间显示。Android系统提供了许多内置的API来处理...
在Android平台上,Canvas是用于2D图形绘制的核心组件,它提供了丰富的绘图API,使得开发者可以自由地在屏幕上画出各种形状、线条、图像等。本项目“Android Canvas 简单打地鼠游戏”就是一个利用Canvas进行游戏开发...
避免ANR的方法包括使用异步任务、服务或Handler来处理长时间运行的任务。 2. **Force Close**:当程序出现未捕获的异常并终止时,会触发Force Close。通过充分测试和异常处理,可以预防这种情况。虽然不能直接捕获...
3. **2D图形绘制**:Android提供了Canvas和SurfaceView等组件用于绘制2D图形。游戏中的角色、障碍物和背景等元素都需要通过这些API来绘制。 4. **物理引擎**:为了模拟真实的跳跃效果,涂鸦跳跃可能会使用简单的...
2. **Android SDK**:SDK是开发Android应用的必备工具,包含了API库、模拟器、各种版本的Android系统映像以及开发者工具。 3. **Activity生命周期**:理解Activity的启动、暂停、恢复、停止和销毁状态至关重要,这...
通过这个项目源码的学习,开发者不仅能掌握Android基本组件的使用,还能深入理解游戏开发的生命周期、动画制作、音频处理以及用户体验设计等方面的知识。对于想要提高Android编程技能,尤其是游戏开发能力的开发者来...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建具有独特功能和交互的视图组件。这个简易五子棋小游戏就是这样一个实例,它展示了如何将自定义View应用于游戏开发中。下面我们将深入...
一个Android游戏通常包含Activity(应用程序组件)、Layout(界面布局)、Drawable(图像资源)以及Java代码等部分。在这个项目中,主Activity将承载游戏的主要逻辑,而Layout文件则定义了用户界面的布局。图片资源...
5. **炸弹定时爆炸**:这需要使用到Android的计时器(如CountDownTimer或Handler/Runnable组合)来设置定时触发事件,比如炸弹爆炸。同时,还需要考虑爆炸的动画效果,这可能需要用到Animation类或者自定义动画库。 ...
【安卓版俄罗斯方块】是一款经典的休闲益智游戏,它基于传统的俄罗斯方块玩法,针对Android操作系统进行了适配和优化。这款安卓版的俄罗斯方块不仅保留了原版游戏的核心乐趣,还可能加入了新的功能和视觉效果,为...
总结,制作Android版的“俄罗斯方块”涉及到了Android基础组件的使用、自定义View的绘制、游戏逻辑的实现以及性能优化等多个方面,对于Android开发者来说,这是一个很好的学习和实践项目,有助于加深对Android开发的...
"安卓口袋微博"是一款针对Android平台开发的应用程序,它提供了便捷的微博浏览、发布和互动功能,让用户在手机上也能轻松玩转社交网络。这款应用的开发涉及到Android平台的Java编程语言,以及Web服务的交互,是...
可以使用`AsyncTask`或者`Handler`来实现异步操作,这样即使在蓝牙通信过程中,用户仍能正常与界面交互。 **6. 对战匹配** 为了让两个设备能够配对并开始游戏,需要实现一个匹配过程。这可能涉及到扫描、连接和断开...
在开发“俄罗斯方块”时,我们需要理解Java的基本语法、面向对象编程概念,以及如何使用Java的图形用户界面(GUI)组件。 三、Android Studio与Java结合开发 1. 创建项目:首先,打开Android Studio,选择“Start a...