Android之Looper、Handler、Message、MessageQueue应用篇
2013-05-26 22:45
411 查看
简介
上一篇文章介绍了Handler、Message、MessageQueue等Android线程交互方面的内容,Android之理解Looper、Handler、Message、MessageQueue。下面开始实践,学习如何去使用以及应用到程序里面。
实例
在这里使用ListView作为异步下载图片的环境。
1、Handle+Runnable
实现思路是:
1:在UI线程中启动一个线程,让这个线程去下载图片。
2:图片完成下载后发送一个消息去通知UI线程
3:UI线程获取到消息后,更新UI。
效果如下:
快速滑动的过程中,还是出现了ANR的现象。
这是因为handler.post(new Runnable()这个方法,并没有开启一个新的线程,他还是在UI主线程中,所以导致出现ANR现象。
2、Handle+Runnable+Message
实现思路:
实现代码:
也是会出现ANR的现象,原因和之前一样。
上一篇文章介绍了Handler、Message、MessageQueue等Android线程交互方面的内容,Android之理解Looper、Handler、Message、MessageQueue。下面开始实践,学习如何去使用以及应用到程序里面。
实例
在这里使用ListView作为异步下载图片的环境。
1、Handle+Runnable
实现思路是:
1:在UI线程中启动一个线程,让这个线程去下载图片。
2:图片完成下载后发送一个消息去通知UI线程
3:UI线程获取到消息后,更新UI。
package com.example.handlerloadiage; import java.io.IOException; import java.net.URL; import android.app.Activity; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; public class Handler_Runnable_Mode extends Activity { private ListView listview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_handlerimageloader); listview = (ListView) findViewById(R.id.listview); listview.setAdapter(new MyAdapter()); } private class MyAdapter extends BaseAdapter { public MyAdapter() { } @Override public int getCount() { // TODO Auto-generated method stub return 100; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(getApplicationContext()) .inflate(R.layout.list_item, null); } final ImageView image = (ImageView) convertView .findViewById(R.id.imageview); final String imageURL = "http://avatar.csdn.net/D/1/4/3_wangjinyu501.jpg"; Handler handler = new Handler(); handler.post(new Runnable() { public void run() { Drawable drawable = null; try { drawable = Drawable.createFromStream( new URL(imageURL).openStream(), "image.jpg"); } catch (IOException e) { Log.d("test", e.getMessage()); } if (drawable == null) { Log.d("test", "null drawable"); } else { Log.d("test", "not null drawable"); } if (drawable == null) { image.setImageResource(R.drawable.ic_launcher); } else { image.setImageDrawable(drawable); } } }); return convertView; } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
效果如下:
快速滑动的过程中,还是出现了ANR的现象。
这是因为handler.post(new Runnable()这个方法,并没有开启一个新的线程,他还是在UI主线程中,所以导致出现ANR现象。
2、Handle+Runnable+Message
实现思路:
实现代码:
package com.example.handlerloadiage; import java.io.IOException; import java.net.URL; import android.app.Activity; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; public class Handler_Runnable_Mode extends Activity { private ListView listview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_handlerimageloader); listview = (ListView) findViewById(R.id.listview); listview.setAdapter(new MyAdapter()); } private class MyAdapter extends BaseAdapter { public MyAdapter() { } @Override public int getCount() { // TODO Auto-generated method stub return 100; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(getApplicationContext()) .inflate(R.layout.list_item, null); } final ImageView image = (ImageView) convertView .findViewById(R.id.imageview); final String imageURL = "http://avatar.csdn.net/D/1/4/3_wangjinyu501.jpg"; final Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Drawable d=(Drawable) msg.obj; if (d == null) { image.setImageResource(R.drawable.ic_launcher); } else { image.setImageDrawable(d); } } }; handler.post(new Runnable() { public void run() { Drawable drawable = null; try { drawable = Drawable.createFromStream( new URL(imageURL).openStream(), "image.jpg"); Message message=handler.obtainMessage(); message.obj=drawable; handler.sendMessage(message); } catch (IOException e) { Log.d("test", e.getMessage()); } if (drawable == null) { Log.d("test", "null drawable"); } else { Log.d("test", "not null drawable"); } } }); return convertView; } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
也是会出现ANR的现象,原因和之前一样。
相关文章推荐
- [置顶] [Android源代码分析]Android消息机制,Handler,Message,Looper,MessageQueue
- Android 消息处理机制(Looper、Handler、MessageQueue,Message)
- Android 中消息模型的四大核心对象:Message、MessageQueue、Looper、Handler
- [Android]Handler-Looper-MessageQueue-Message、HandlerThread
- android中MessageQueue,Message,Looper,handler的关系
- Android笔记-MultiThreading in Android(1)-Thread,Looper,Handler,Message,MessageQueue之间的关系
- Android的Message,MessageQueue,Looper,Handler详解+实例
- android.os 源代码中的Looper,Handler,Message,MessageQueue
- Android : Thread, handler, messagequeue, message, Looper 的交互。
- Android中的Handler,Message,MessageQueue,Looper 原理关系图
- android多线程编程详解,关于Handler ,Looper , Message , MessageQueue
- Android 面试总结 Handler、Looper、Message、MessageQueue基础流程分析
- Android中Message,MessageQueue,Looper,Handler详解+实例
- Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)
- Android异步消息处理机制,深入理解Handler(MessageQueue、Message、Looper)
- Android消息机制探索(Handler,Looper,Message,MessageQueue)
- android消息处理机制学习(三)-Handler,Message,MessageQueue,Looper源码分析
- [推荐]Android消息处理机制(Handler、Looper、MessageQueue与Message) Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息
- Android消息处理机制(Handler、Looper、MessageQueue与Message)
- 深入源码解析Android中的Handler,Message,MessageQueue,Looper