Android的Handler总结

时间:2024.4.25

一、Handler的定义:

主要接受子线程发送的数据, 并用此数据配合主线程更新UI.

解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button,

Android会分发事件到Button上,来响应你的操作。 如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 "强制关闭". 这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据) , 把这些消息放入主线程队列中,配合主线程进行更新UI。

二、Handler一些特点

handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),

它有两个作用: (1): 安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行

Handler中分发消息的一些方法

post(Runnable)

postAtTime(Runnable,long)

postDelayed(Runnable long)

sendEmptyMessage(int)

sendMessage(Message)

sendMessageAtTime(Message,long)

sendMessageDelayed(Message,long)

以上post类方法允许你排列一个Runnable对象到主线程队列中,

sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

三、Handler实例

(1) 子类需要继承Handler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据

以下为一个实例,它实现的功能为 : 通过线程修改界面Button的内容

01 public class MyHandlerActivity extends Activity {

02 Button button;

03 MyHandler myHandler;

04

05 protected void onCreate(Bundle savedInstanceState) {

06 super.onCreate(savedInstanceState);

07 setContentView(R.layout.handlertest);

08

09 button = (Button) findViewById(R.id.button);

10 myHandler = new MyHandler();

// 当创建一个新的Handler实例时, 它会绑定到当前线程和消息11 的队列中,开始分发数据

// Handler有两个作用, (1) : 定时执行Message和Runnalbe 对12 象

13 // (2): 让一个动作,在不同的线程中执行.

14

15 // 它安排消息,用以下方法

16 // post(Runnable)

17 // postAtTime(Runnable,long)

18 // postDelayed(Runnable,long)

19 // sendEmptyMessage(int)

20 // sendMessage(Message);

21 // sendMessageAtTime(Message,long)

22 // sendMessageDelayed(Message,long)

23

24 // 以上方法以 post开头的允许你处理Runnable对象

//sendMessage()允许你处理Message对象(Message里可以包含数25 据,)

26

27 MyThread m = new MyThread();

28 new Thread(m).start();

29 }

30

31 /**

32 * 接受消息,处理消息 ,此Handler会与当前主线程一块运行 33 * */

34

35 class MyHandler extends Handler {

36 public MyHandler() {

37 }

38

39 public MyHandler(Looper L) {

40 super(L);

41 }

42

43 // 子类必须重写此方法,接受数据

44 @Override

45 public void handleMessage(Message msg) {

46 // TODO Auto-generated method stub

47 Log.d("MyHandler", "handleMessage......"); 48 super.handleMessage(msg);

49 // 此处可以更新UI

50 Bundle b = msg.getData();

51 String color = b.getString("color");

52 MyHandlerActivity.this.button.append(color); 53

54 }

55 }

56

57 class MyThread implements Runnable {

58 public void run() {

59

60 try {

61 Thread.sleep(10000);

62 } catch (InterruptedException e) {

63 // TODO Auto-generated catch block

64 e.printStackTrace();

65 }

66

67 Log.d("thread.......", "mThread........"); 68 Message msg = new Message();

69 Bundle b = new Bundle();// 存放数据

70 b.putString("color", "我的");

71 msg.setData(b);

72

MyHandlerActivity.this.myHandler.sendMessage(msg); // 73 向Handler发送消息,更新UI

74

75 }

76 }


第二篇:android的Handler


android的Handler

前言

学习android一段时间了,为了进一步了解android的应用是如何设计开发的,决定详细研究几个开源的android应用。从一些开源应用中吸收点东西,一边进行量的积累,一边探索android的学习研究方向。这里我首先选择了jwood的 Standup Timer 项目。本文将把研究的内容笔记整理,建立一个索引列表。

android handler概念解释

2010-08-29 20:13

本文是翻译了SDK中handle类的概述部分。推荐大家尽量多看SDK英文版。

handler类允许你发送消息和处理线程消息队列中的消息及runnable对象。handler实例都是与一个线程和该线程的消息队列一起使用,一旦创建了一个新的handler实例,系统就把该实例与一个线程和该线程的消息队列捆绑起来,这将可以发送消息和runnable对象给该消息队列,并在消息队列出口处处理它们。

handler类有两种主要用途:1。按照时间计划,在未来某时刻,对处理一个消息或执行某个runnable实例。2。把一个对另外线程对象的操作请求放入消息队列中,从而避免线程间冲突。

时间类消息通过如下方法使用: post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int),

sendMessage(Message), sendMessageAtTime(Message, long), and

sendMessageDelayed(Message, long)

methods. post之类函数可以传输一个runnable对象给消息队列,并在到达消息队列后被调用。sendmessage之类函数可以传送一个包含数据的message对象,该message对象可以被Handler类的handleMessage(Message) 方法所处理。

post之类函数和sendmessage之类的函数都可以指定消息的执行时机,是立即执行、稍后一段时间执行,还是在某个确定时刻执行。这可以用来实现超时、消息或其他时间相关的操作。

当一个进程启动时,主线程独立执行一个消息队列,该队列管理着应用顶层的对象(如:activities、broadcast receivers等等)和所有创建的窗口。你可以创建自己的一个线程,并通过handler来与主线程进行通信。这可以通过在新的线程中调用主线程的handler的post和sendmessage操作来实现。

关键词

Android.os.Handler涉及较多的知识点,我把一些关键词列举在下面,将主要介绍Handler: ?

?

?

? android.os.Handler 、 android.os.Handler.Callback Looper、 Threadle、Runnable Message、Message queue android.os.Handler Handler在android里负责发送和处理消息。它的主要用途有:

1)按计划发送消息或执行某个Runnanble(使用POST方法);

2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程) 默认情况下,Handler接受的是当前线程下的消息循环实例(使用

Handler(Looper looper)、Handler(Looper looper, Handler.Callback callback)可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以sendMessage。Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。

倒计时程序

利用Timer 编写一个倒计时程序,程序使用Timer和TimerTask来完成倒计时,同时使用sendMessages方法发送消息,然后在HanleMessage里更新UI。

Activity布局:

Layout

这里使用TextView 来显示倒计时的时间变化,两个按钮用于控制时间的开始和停止。SeekBar主要是用于查看线程是否被阻塞(阻塞时无法拖动)。

onCreate

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

txt = (TextView) findViewById(R.id.txt);

btnStart = (Button) findViewById(R.id.btnStartTime);

btnStop = (Button) findViewById(R.id.btnStopTime);

Log.d("ThreadId", "onCread:"

+ String.valueOf(Thread.currentThread().getId()));

myHandler = new Handler(this);

btnStart.setOnClickListener(this);

btnStop.setOnClickListener(this);

}

在onCreate方法中初始化元素个元素,myHandler = new Handler(this); 调用的是 Handler(Handler.Callback callback)构造函数,在回调方法callback中对发送来的消息进行处理(这样我们就不必使用内部类的写法来 重写HandleMessage()方法了),因此Activity必须实现 android.os.Handler.Callback 接口。我们还在将onCreate 方法的ThreadId 记录在了Log中用以和消息发送、处理时所作的线程进行比较。

发送消息

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btnStartTime:

startTimer();

break;

case R.id.btnStopTime:

timer.cancel();

break;

}

}

private synchronized void startTimer() {

timer = new Timer();

// TimerTask updateTimerValuesTask = new TimerTask() {

// @Override

// public void run() {

// updateTimerValues();

// }

//

// };

//自定义的CallBack模式。Task继承自TimerTask

Task updateTimerValuesTask = new Task(this);

timer.schedule(updateTimerValuesTask, 1000, 1000);

}

//执行耗时的倒计时任务。

private void updateTimerValues() {

total--;

Log.d("ThreadId", "send:"

+ String.valueOf(Thread.currentThread().getId()));

Message msg=new Message();

Bundle date = new Bundle();// 存放数据

date.putInt("time", total);

msg.setData(date);

msg.what=0;

myHandler.sendMessage(msg);

//另一种写法

// Message msg=myHandler.obtainMessage();

// Bundle date = new Bundle();// 存放数据

// date.putInt("time", total);

// msg.setData(date);

// msg.what=0;

// msg.sendToTarget();

}

@Override

public void TaskRun() {

updateTimerValues();

}

实现Button按钮的事件处理以此进入倒计时操作。这里使用的Timer 来执行定时操作(其实我们完全可以另起一个线程)。Task类继承了TimerTask类,里面增加了一个任务处理接口来实现回调模式,应此Activity需要实现该回调的接口 ITaskCallBack(这样做是因为我比较不喜欢内部类的编写方法)。

ICallBack接口和Task类

public interface ITaskCallBack {

void TaskRun();

}

public class Task extends TimerTask {

private ITaskCallBack iTask;

public Task(ITaskCallBack iTaskCallBack)

{

super();

iTask=iTaskCallBack;

}

public void setCallBack(ITaskCallBack iTaskCallBack)

{

iTask=iTaskCallBack;

}

@Override

public void run() {

// TODO Auto-generated method stub

iTask.TaskRun();

}

}

这是Java的回调函数的一般写法。

实现CallBack

/**

* 实现消息处理

*/

@Override

public boolean handleMessage(Message msg) {

switch(msg.what)

{

case 0:

Bundle date=msg.getData();

txt.setText(String.valueOf(date.getInt("time")));

Log.d("ThreadId", "HandlerMessage:"

+ String.valueOf(Thread.currentThread().getId())); Log.d("ThreadId", "msgDate:"

+ String.valueOf(date.getInt("time")));

break;

}

return false;

android的Handler

}

可以看到 实现 android.os.Handler.Callback 接口,其实就是对handleMessage()方法进行重写(和内部类的一个区别是,内部类的返回值是Void)。

运行结果

可以看到在onCreate 方法中线程的ID是1(UI线程) 这与 HandlerMessage 进行消息处理时是所作的线程ID是一样的,而消息发送的线程ID则为8非UI线程。 使用Threadle进行实现

Activity类

public class ThreadHandlerrActivity extends Activity implements Callback, OnClickListener {

private TextView txt;

private Button btnStart, btnStop;

private Handler myHandler;

private TimerThread timerThread;

private int Total=30;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

txt = (TextView) findViewById(R.id.txt);

btnStart = (Button) findViewById(R.id.btnStartTime); btnStop = (Button) findViewById(R.id.btnStopTime);

Log.d("ThreadId", "onCread:"

+ String.valueOf(Thread.currentThread().getId())); myHandler = new Handler(this);

btnStart.setOnClickListener(this);

btnStop.setOnClickListener(this);

}

/**

* 实现消息处理

*/

@Override

public boolean handleMessage(Message msg) {

switch(msg.what)

{

case 0:

Bundle date=msg.getData();

txt.setText(String.valueOf(date.getInt("time")));

Log.d("ThreadId", "HandlerMessage:"

+ String.valueOf(Thread.currentThread().getId())); Log.d("ThreadId", "msgDate:"

+ String.valueOf(date.getInt("time")));

break;

}

return false;

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btnStartTime:

//自定义的线程

timerThread=new TimerThread(myHandler,60);

timerThread.start();

break; case R.id.btnStopTime:

timerThread.stop();

//timerThread.destroy();

break;

}

}

}

自定义的线程类

**

* 自定义的线程类,通过传入的Handler,和Total 定期执行耗时操作 * @author linzijun

*

*/

public class TimerThread extends Thread {

public int Total=60;

public Handler handler;

/**

* 初始化构造函数

* @param mhandler handler 用于发送消息

* @param total 总周期

*/

public TimerThread(Handler mhandler,int total) {

super();

handler=mhandler;

Total=total;

}

@Override

public void run() {

while(true)

{

Total--;

if(Total<0)

break;

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block e.printStackTrace();

}

Message msg=new Message();

Bundle date = new Bundle();// 存放数据

date.putInt("time", Total);

msg.setData(date);

msg.what=0;

Log.d("ThreadId", "Thread:"

+ String.valueOf(Thread.currentThread().getId()));

handler.sendMessage(msg);

}

super.run();

}

}

这里继承了Thread类,也可以直接实现 Runnable接口。

关于POST

Post的各种方法是把一个Runnable发送给消息队列,它将在到达时进行处理。

POST

public class PostHandler extends Activity implements OnClickListener, Runnable {

private TextView txt;

private Button btnStart, btnStop;

private Handler myHandler;

private Timer timer;

private int total = 60;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

txt = (TextView) findViewById(R.id.txt);

btnStart = (Button) findViewById(R.id.btnStartTime);

btnStop = (Button) findViewById(R.id.btnStopTime);

Log.d("ThreadId", "onCread:"

+ String.valueOf(Thread.currentThread().getId()));

myHandler = new Handler()

{

@Override

public void handleMessage(Message msg) {

switch(msg.what)

{

case 0:

Bundle date=msg.getData();

txt.setText(String.valueOf(date.getInt("time")));

Log.d("ThreadId", "HandlerMessage:"

+ String.valueOf(Thread.currentThread().getId())); Log.d("ThreadId", "msgDate:"

+ String.valueOf(date.getInt("time")));

break;

}

}

};

btnStart.setOnClickListener(this);

btnStop.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btnStartTime:

//myHandler.post(this);

myHandler.postDelayed(this, 1000);

break;

case R.id.btnStopTime:

break; }

}

@Override

public void run() {

while(true)

{

total--;

if(total<0)

break;

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

Message msg=new Message();

Bundle date = new Bundle();// 存放数据

date.putInt("time", total);

msg.setData(date);

msg.what=0;

Log.d("ThreadId", "POST:"

+ String.valueOf(Thread.currentThread().getId()));

myHandler.sendMessage(msg);

Log.d("ThreadId", "Thread:"

+ String.valueOf(Thread.currentThread().getId()));

}

}

}

使用POST的方式 是将Runnable 一起发送给处理的线程(这里为UI),如果Runnable的操作比较耗时的话那线程将进入阻塞状态。可以看到先运行 Runnable的Run方法 然后在进入 HandleMessage() 。我还尝试了另一种写法,将TimerThreadPOST过去,运行结果是一样的。

代码

package zijunlin.me;

import java.util.Timer;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

public class PostHandler extends Activity implements OnClickListener, Runnable {

private TextView txt;

private Button btnStart, btnStop;

private Handler myHandler;

private Timer timer;

private int total = 60;

private TimerThread timerThread;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

txt = (TextView) findViewById(R.id.txt);

btnStart = (Button) findViewById(R.id.btnStartTime);

btnStop = (Button) findViewById(R.id.btnStopTime);

Log.d("ThreadId", "onCread:"

+ String.valueOf(Thread.currentThread().getId()));

myHandler = new Handler()

{

@Override

public void handleMessage(Message msg) {

switch(msg.what)

{

case 0:

Bundle date=msg.getData();

txt.setText(String.valueOf(date.getInt("time")));

Log.d("ThreadId", "HandlerMessage:"

+ String.valueOf(Thread.currentThread().getId())); Log.d("ThreadId", "msgDate:"

+ String.valueOf(date.getInt("time")));

break;

}

}

};

btnStart.setOnClickListener(this);

btnStop.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btnStartTime:

//myHandler.post(this);

//myHandler.postDelayed(this, 1000);

timerThread=new TimerThread(myHandler,60);

myHandler.post(timerThread);

break;

case R.id.btnStopTime:

break;

}

}

@Override

public void run() {

while(true)

{

total--;

if(total<0)

break;

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

Message msg=new Message();

Bundle date = new Bundle();// 存放数据

date.putInt("time", total);

msg.setData(date);

msg.what=0;

Log.d("ThreadId", "POST:"

+ String.valueOf(Thread.currentThread().getId()));

myHandler.sendMessage(msg);

Log.d("ThreadId", "Thread:"

+ String.valueOf(Thread.currentThread().getId()));

}

}

}

可以说POST的各种方法主要是用于 “按计划发送消息或执行某个Runnanble(使用POST方法)”。

一、Handler的定义:

主要接受子线程发送的数据, 并用此数据配合主线程更新UI.

解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button, Android会分发事件到Button上,来响应你的操作。 如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 "强制关闭". 这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据) , 把这些消息放入主线程队列中,配合主线程进行更新UI。

二、Handler一些特点

handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),

它有两个作用: (1): 安排消息或Runnable 在某个主线程中某个地方执行,

(2)安排一个动作在不同的线程中执行

Handler中分发消息的一些方法

post(Runnable)

postAtTime(Runnable,long)

postDelayed(Runnable long)

sendEmptyMessage(int)

sendMessage(Message)

sendMessageAtTime(Message,long)

sendMessageDelayed(Message,long)

以上post类方法允许你排列一个Runnable对象到主线程队列中,

sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

三、Handler实例

(1) 子类需要继承Handler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据 以下为一个实例,它实现的功能为 : 通过线程修改界面Button的内容 1 public class MyHandlerActivity extends Activity {

2 Button button;

3 MyHandler myHandler;

4

5 protected void onCreate(Bundle savedInstanceState) {

6 super.onCreate(savedInstanceState);

7 setContentView(R.layout.handlertest);

8

9 button = (Button) findViewById(R.id.button);

10 myHandler = new MyHandler();

11 // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据

12 // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象 13 // (2): 让一个动作,在不同的线程中执行.

14

15 // 它安排消息,用以下方法

16 // post(Runnable)

17 // postAtTime(Runnable,long)

18 // postDelayed(Runnable,long)

19 // sendEmptyMessage(int)

20 // sendMessage(Message);

21 // sendMessageAtTime(Message,long)

22 // sendMessageDelayed(Message,long)

23

24 // 以上方法以 post开头的允许你处理Runnable对象

25 //sendMessage()允许你处理Message对象(Message里可以包含数据,) 26

27 MyThread m = new MyThread();

28 new Thread(m).start();

29 }

30

31 /**

32 * 接受消息,处理消息 ,此Handler会与当前主线程一块运行 33 * */

34

35 class MyHandler extends Handler {

36 public MyHandler() {

37 }

38

39 public MyHandler(Looper L) {

40 super(L);

41 }

42

43 // 子类必须重写此方法,接受数据

44 @Override

45 public void handleMessage(Message msg) { 46 // TODO Auto-generated method stub

47 Log.d("MyHandler", "handleMessage......"); 48 super.handleMessage(msg);

49 // 此处可以更新UI

50 Bundle b = msg.getData();

51 String color = b.getString("color");

52 MyHandlerActivity.this.button.append(color); 53

54 }

55 }

56

57 class MyThread implements Runnable {

58 public void run() {

59

60 try {

61 Thread.sleep(10000);

62 } catch (InterruptedException e) {

63 // TODO Auto-generated catch block 64 e.printStackTrace();

65 }

66

67 Log.d("thread.......", "mThread........"); 68 Message msg = new Message();

69 Bundle b = new Bundle();// 存放数据

70 b.putString("color", "我的");

71 msg.setData(b);

72

73 MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI

74

75 }

76 }

77

78 }

更多相关推荐:
Android总结

Android总结第一步Android1在Windows下搭建Android开发环境以及HelloWorld程序搭建Android的开发环境以及写一个简单的示例程序在Windows下搭建Android开发环境A...

android基本知识点总结

一android四大组件ActivityServiceBroadcastReceiverContentProvider二Activity生命周期三横竖屏切换时的生命周期1新建一个Activity并把各个生命周期...

一周学习Android 的总结

初学Android的总结一对Android的初步认识有以下几方面1Android是什么Android是Google在20xx年11月首次发布的当时它被定位成一款针对智能手机的操作系统现在是一个专门针对移动设备的...

android开发总结

Android开发简介Android应用程序的五大基本组件Activity应用表示层基类Activity一个活动表示一个可视化的用户界面关注一个用户从事的事件例如一个活动可能表示一个用户可选择的菜单项列表或者可...

Android总结

AndroidContentprovidercontentProvider对外共享数据统一数据访问接口多个项目可以访问1UriUri的作用为互联网上所涉及的所有资源HTML文档图像视频片段程序等提供一种统一的唯...

Android个人学习笔记总结

Android学习笔记总结第一步Android1在Windows下搭建Android开发环境以及HelloWorld程序搭建Android的开发环境以及写一个简单的示例程序在Windows下搭建Android开...

Android学习心得

Android学习心得这学期我们新开了一门课程android的研发在老师们的介绍下我们了解android的开发环境以及控件的功能刚开始接触Android觉得既陌生又亲切陌生在于没有学过具体的开发软件亲切在于它在...

Android Dialog用法总结

AndroidDialog用法总结20xx12220947231人阅读评论0收藏举报一AlertDialogBuilderAndroid中的alertDialog的创建一般是通过其内嵌类AlertDialogB...

Android总结篇系列:Android广播机制===

Android总结篇系列Android广播机制1Android广播机制概述Android广播分为两个方面广播发送者和广播接收者通常情况下BroadcastReceiver指的就是广播接收者广播接收器广播作为An...

Android面试题总结强劲版(一)

自己总结的最强android应用面试题集1activity的生命周期onCreate在activity第一次被创建的时候调用这里是你做所有初始化设置的地方创建视图绑定数据至列表等如果曾经有状态记录参阅后述Sav...

Android的Handler总结

一Handler的定义主要接受子线程发送的数据并用此数据配合主线程更新UI解释当应用程序启动时Android首先会开启一个主线程也就是UI线程主线程为管理界面中的UI控件进行事件分发比如说你要是点击一个Butt...

Android面试题总结强劲版(一)

自己总结的最强android应用面试题集1activity的生命周期onCreate在activity第一次被创建的时候调用这里是你做所有初始化设置的地方创建视图绑定数据至列表等如果曾经有状态记录参阅后述Sav...

android总结(40篇)