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

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 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值