您的位置:首页 > 移动开发 > Android开发

android 异步处理采用Thread + Handler + Message

2014-07-08 15:17 141 查看
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
}
三、采用Thread
+ Handler + post方法

使用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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐