android 异步处理采用Thread + Handler + Message
来源:互联网 发布:mac玩美服lol加速器 编辑:程序博客网 时间:2024/06/10 03:53
Handler简介 Handler为Android提供了一种异步消息处理机制,它包含两个队列,一个是线程列队,另一个是消息列队。使用post方法将线 程对象添加到线程队列中,使用sendMessage(Message message)将消息放入消息队列中。当向消息队列中发送消息后就立 即返回,而从消息队列中读取消息对象时会阻塞,继而回调Handler中public void handleMessage(Message msg)方法。因此 在创建Handler时应该使用匿名内部类重写该方法。如果想要这个流程一直执行的话,可以再run方法内部执行postDelay或者 post方法,再将该线程对象添加到消息队列中重复执行。想要停止线程,调用Handler对象的removeCallbacks(Runnable r)从 线程队列中移除线程对象,使线程停止执行。ThreadHandlerActivity.java
01
public
class
ThreadHandlerActivity
extends
Activity {
02
03
private
List<String> urlList;
04
private
ImageAdapter listItemAdapter;
05
private
LinkedList<HashMap<String, Object>> listItem;
06
private
Handler handler;
07
private
ExecutorService executorService = Executors.newFixedThreadPool(
10
);
08
09
@Override
10
public
void
onCreate(Bundle savedInstanceState) {
11
super
.onCreate(savedInstanceState);
12
setContentView(R.layout.activity_main);
13
urlList =
new
ArrayList<String>();
14
urlList.add(
"http://www.baidu.com/img/baidu_sylogo1.gif"
);
15
urlList.add(
"http://y2.ifengimg.com/2012/06/24/23063562.gif"
);
16
urlList.add(
"http://himg2.huanqiu.com/statics/images/index/logo.png"
);
17
18
listItem =
new
LinkedList<HashMap<String, Object>>();
19
20
listItemAdapter =
new
ImageAdapter(
this
, listItem);
21
ListView listView = (ListView)
this
.findViewById(R.id.listView1);
22
listView.setAdapter(listItemAdapter);
23
24
handler =
new
Handler(){
25
@Override
26
public
void
handleMessage(Message msg) {
27
HashMap<String, Object> map = (HashMap<String, Object>) msg.obj;
28
listItem.add(map);
29
listItemAdapter.notifyDataSetChanged();
30
}
31
};
32
for
(
final
String urlStr : urlList) {
33
executorService.submit(
new
Runnable() {
34
@Override
35
public
void
run() {
36
try
{
37
URL url =
new
URL(urlStr);
38
Drawable drawable = Drawable.createFromStream(
39
url.openStream(),
"src"
);
40
HashMap<String, Object> table =
new
HashMap<String, Object>();
41
table.put(
"ItemImage"
, drawable);
42
Message msg =
new
Message();
43
msg.obj = table;
44
msg.setTarget(handler);
45
handler.sendMessage(msg);
46
}
catch
(Exception e) {
47
e.printStackTrace();
48
}
49
}
50
});
51
}
52
}
53
54
@Override
55
public
boolean
onCreateOptionsMenu(Menu menu) {
56
getMenuInflater().inflate(R.menu.activity_main, menu);
57
return
true
;
58
}
59
}
使用post方法将Runnable对象放到Handler的线程队列中,该Runnable的执行其实并未单独开启线程,而是仍然在当前Activity的UI线程中执行,Handler只是调用了Runnable对象的run方法。ThreadHandlerPostActivity.java
01
public
class
ThreadHandlerPostActivity
extends
Activity {
02
03
private
List<String> urlList;
04
private
ImageAdapter listItemAdapter;
05
private
LinkedList<HashMap<String, Object>> listItem;
06
private
Handler handler =
new
Handler();
07
private
ExecutorService executorService = Executors.newFixedThreadPool(
10
);
08
09
@Override
10
public
void
onCreate(Bundle savedInstanceState) {
11
super
.onCreate(savedInstanceState);
12
setContentView(R.layout.activity_main);
13
urlList =
new
ArrayList<String>();
14
urlList.add(
"http://www.baidu.com/img/baidu_sylogo1.gif"
);
15
urlList.add(
"http://y2.ifengimg.com/2012/06/24/23063562.gif"
);
16
urlList.add(
"http://himg2.huanqiu.com/statics/images/index/logo.png"
);
17
18
listItem =
new
LinkedList<HashMap<String, Object>>();
19
20
listItemAdapter =
new
ImageAdapter(
this
, listItem);
21
ListView listView = (ListView)
this
.findViewById(R.id.listView1);
22
listView.setAdapter(listItemAdapter);
23
24
for
(
final
String urlStr : urlList) {
25
executorService.submit(
new
Runnable() {
26
@Override
27
public
void
run() {
28
try
{
29
URL url =
new
URL(urlStr);
30
Drawable drawable = Drawable.createFromStream(
31
url.openStream(),
"src"
);
32
final
HashMap<String, Object> table =
new
HashMap<String, Object>();
33
table.put(
"ItemImage"
, drawable);
34
handler.post(
new
Runnable(){
35
36
@Override
37
public
void
run() {
38
listItem.add(table);
39
listItemAdapter.notifyDataSetChanged();
40
}
41
42
});
43
}
catch
(Exception e) {
44
e.printStackTrace();
45
}
46
}
47
});
48
}
49
}
50
51
@Override
52
public
boolean
onCreateOptionsMenu(Menu menu) {
53
getMenuInflater().inflate(R.menu.activity_main, menu);
54
return
true
;
55
}
56
}
0 0
- android 异步处理采用Thread + Handler + Message
- android异步处理Handler+Thread使用进阶
- Android异步消息处理之Thread+Handler
- Android消息处理机制:Handler Thread Message Looper []
- Android消息处理机制:Handler Thread Message Looper
- Android消息处理机制:Handler Thread Message Looper []
- Android消息处理机制:Handler Thread Message Looper
- Android消息处理机制:Handler Thread Message Looper
- Android 消息处理Handler、 Message 、MessageQueue、Looper、Thread协调配合
- android thread Handler 、Looper、 Message、 Message Queue
- Android开发详解之异步处理Handler,Message,Looper详解
- Android-异步消息处理机制(Handler,Looper,Message)
- Android异步处理——Handler、Looper、Message、MessageQueue
- Android异步消息的处理机制(looper handler message)
- Android异步消息处理之Looper,Handler,Message,MessageQueue
- Android 异步消息处理机制:Looper、Handler、Message
- Android异步消息处理机制 Handler、Looper、Message
- Android 异步消息处理机制 深入理解 Looper、Handler、Message
- 2017 字符串统计
- 《python源码剖析》笔记 pythonm内存管理机制
- python对xml文件操作小例程
- error:the kernel you are installing for is a xen kernel!
- maven 转载
- android 异步处理采用Thread + Handler + Message
- 2018 母牛的故事
- Linux -- Crond 定时任务
- Play 标准的应用目录布局
- Linux虚拟文件系统
- volatile线程不安全例子
- Linux Kernel(Android) 加密算法总结(一)(cipher、compress、digest)
- C++构造函数中的初始化:C++构造函数后面的冒号
- 手机助手的那点事儿--经验之谈