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
01public 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  
01public 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