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
三、采用Thread
+ Handler + post方法
使用post方法将Runnable对象放到Handler的线程队列中,该Runnable的执行其实并未单独开启线程,而是仍然在当前Activity的UI线程中执行,Handler只是调用了Runnable对象的run方法。
ThreadHandlerPostActivity.java
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 | } |
+ 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 | } |
相关文章推荐
- Android消息处理机制:Handler Thread Message Looper
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- Android framework Handler\HandlerThread\Looper\Message\MessageQueue\
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面 .
- Android 开发中的 Handler ,Thread ,Message ,Runnable 的综合使用方法
- Thread和Looper以及Handler和Message详解 Android开发必读
- 解析Android消息处理机制 ——HandlerThread/Looper & MessageQueue & Message
- android Thread HandlerThread Looper Message MessageQueue Handler的关系
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- Android消息处理机制:Handler Thread Message Looper []
- android UI更新问题 Thread和Looper以及Handler和Message详解 Android开发必读
- Thread和Looper以及Handler和Message详解 Android开发必读
- 【转】Thread和Looper以及Handler和Message详解 Android开发必读
- Android笔记-MultiThreading in Android(1)-Thread,Looper,Handler,Message,MessageQueue之间的关系
- Thread和Looper以及Handler和Message详解 Android开发必读
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- android Thread HandlerThread Looper Message MessageQueue Handler的关系
- android thread looper messageQueue handler relationship
- [图例]详解Android Thread管理(Handler、Looper、Message、Runnable)