美文网首页
android主线程和子线程之间的消息传递

android主线程和子线程之间的消息传递

作者: MrMagicWang | 来源:发表于2016-07-17 15:12 被阅读215次

转自落叶潇潇雨的博客

从主线程发送消息到工作线程(子线程)

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;

public class LooperThreadActivity extends Activity{
    /** Called when the activity is first created. */ 
    private final int MSG_HELLO = 0;
    private Handler mHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new CustomThread().start();//新建并启动CustomThread实例
        
        findViewById(R.id.send_btn).setOnClickListener(new OnClickListener() {           
            @Override
            public void onClick(View v) {//点击界面时发送消息
                String str = "hello";
                Log.d("Test", "MainThread is ready to send msg:" + str);
                mHandler.obtainMessage(MSG_HELLO, str).sendToTarget();//发送消息到CustomThread实例               
            }
        });        
    }       

    class CustomThread extends Thread {
        @Override
        public void run() {
            //建立消息循环的步骤
            Looper.prepare();//1、初始化Looper
            mHandler = new Handler(){//2、绑定handler到CustomThread实例的Looper对象
                public void handleMessage (Message msg) {//3、定义处理消息的方法
                    switch(msg.what) {
                    case MSG_HELLO:
                        Log.d("Test", "CustomThread receive msg:" + (String) msg.obj);
                    }
                }
            };
            Looper.loop();//4、启动消息循环
        }
    }
}

从非UI线程传递消息到UI线程(界面主线程),因为主界面已经有MessageQueue,所以可以直接获取消息处理消息。而上面由主线程向非UI线程中处理消息的时候,非UI线程需要先添加消息队列,然后处理消息循环。

public class ThreadHandlerActivity extends Activity {
    /** Called when the activity is first created. */
    
    private static final int MSG_SUCCESS = 0;//获取图片成功的标识
    private static final int MSG_FAILURE = 1;//获取图片失败的标识
    
    private ImageView mImageView;
    private Button mButton;
    
    private Thread mThread;
    
    private Handler mHandler = new Handler() {
        public void handleMessage (Message msg) {//此方法在ui线程运行
            switch(msg.what) {
            case MSG_SUCCESS:
                mImageView.setImageBitmap((Bitmap) msg.obj);
                //imageview显示从网络获取到的logo
                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);//显示图片的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() {//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;
            }
            mHandler.obtainMessage(MSG_SUCCESS,bm).sendToTarget();
            //获取图片成功,向ui线程发送MSG_SUCCESS标识和bitmap对象

        }
    };
}

相关文章

  • Handler详解

    Handler详解 举例 线程间传递数据(主线程跟子线程、两个子线程) 简介 一套android消息传递机制。在多...

  • android主线程和子线程之间的消息传递

    转自落叶潇潇雨的博客 从主线程发送消息到工作线程(子线程) 从非UI线程传递消息到UI线程(界面主线程),因为主界...

  • Handler和HandlerThread总结

    一般我们使用Hanlder是在子线程和UI线程(主线程)之间传递消息,当Hanlder在UI线程中new出来时候,...

  • 浅析Handler消息传递机制

    Android的异步消息处理机制:Handler消息传递机制。 1、Message Message是在线程之间传递...

  • 还在用RxBus&EventBus?你Out啦!哥哥教你

    首先我们来看消息总线的进化: 消息传递既可以用于Android四大组件之间的通信,也可用于异步线程和主线程之间的通...

  • Java并发基础:线程间通信

    在Android中,我们有Handler,在子线程和主线程之间通信,只需要拿到主线程的Handler发送消息即可,...

  • Handler 机制 -- 1

    1.前言 *定义* 1.一套Android消息传递机制/ 异步通信机制 2.主线程和子线程的通信媒...

  • Android——消息机制中的Message Pool是个什么鬼

    引言 Android中,我们在线程之间通信传递通常采用Android的消息机制,而这机制传递的正是Message。...

  • Handler机制详解

    1. Handler简介 Handler机制,说的也是Android中的消息传递机制。也就是将工作线程(子线程)中...

  • android消息机制

    Android消息传递机制 标签(空格分隔): android 概述: 消息机制的常见应用场景:在子线程中进行耗时...

网友评论

      本文标题:android主线程和子线程之间的消息传递

      本文链接:https://www.haomeiwen.com/subject/nttpjttx.html