概述:每一个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关的事件,所以主线程一般又叫UI线程。ide
而因为Android采用UI单线程模型,因此只能在主线程中对UI元素进行操做。post
若是在非UI线程直接对UI进行了操做,则会报错:ui
CalledFromWrongThreadException:only the original thread that created a view hierarchy can touch its viewsspa
Android为咱们提供了消息循环的机制,咱们能够利用这个机制来实现线程间的通讯。那么,咱们就能够在非UI线程发送消息到UI线程,最终让UI线程来进行UI的操做。线程
对于运算量较大的操做和IO操做,咱们须要新开线程来处理这些繁重的工做,以避免阻塞ui线程。code
例子:下面咱们以获取CSDN logo的例子,演示如何使用Thread+Handler的方式实如今非UI线程发送消息通知UI线程更新界面。对象
- public class ThreadHandlerActivity extends Activity {
-
-
- private static final int MSG_SUCCESS = 0;
- private static final int MSG_FAILURE = 1;
-
- private ImageView mImageView;
- private Button mButton;
-
- private Thread mThread;
-
- //handleMessage()此方法是主线程用来处理发送给它的消息
- private Handler mHandler = new Handler() {
- public void handleMessage (Message msg) {
- //判断msg.what的值能够知道mThread是否成功获取图片
- switch(msg.what) {
- case MSG_SUCCESS:
- mImageView.setImageBitmap((Bitmap) msg.obj);
- Toast.makeText(getApplication(), getApplication().getString(R.string.get_pic_success), Toast.LENGTH_LONG).show();
- break;
- case MSG_FAILURE:
- Toast.makeText(getApplication(), getApplication().getString(R.string.get_pic_failure), Toast.LENGTH_LONG).show();
- break;
- }
- }
- };
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mImageView= (ImageView) findViewById(R.id.imageView);
- mButton = (Button) findViewById(R.id.button);
- mButton.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- if(mThread == null) {
- mThread = new Thread(runnable);
- mThread.start();
- }
- else {
- Toast.makeText(getApplication(), getApplication().getString(R.string.thread_started), Toast.LENGTH_LONG).show();
- }
- }
- });
- }
-
- Runnable runnable = new Runnable() {
-
- @Override
- public void run() {
- HttpClient hc = new DefaultHttpClient();
- HttpGet hg = new HttpGet("http://csdnimg.cn/www/images/csdnindex_logo.gif"); //获取csdn的logo
- final Bitmap bm;
- try {
- HttpResponse hr = hc.execute(hg);
- bm = BitmapFactory.decodeStream(hr.getEntity().getContent());
- } catch (Exception e) {
- mHandler.obtainMessage(MSG_FAILURE).sendToTarget();
- return;
- }
- //obtainMessage()发送消息到UI线程的消息队列
- mHandler.obtainMessage(MSG_SUCCESS,bm).sendToTarget();
-
-
-
- // 子线程经过post将Runnable加入到主线程的messagequeue中,主线程调用runnable的方法,至关于在主线程中更新UI,执行
-
-
-
-
-
-
-
- }
- };
-
- }