Android多线程和异步消息的简单应用

多线程在几乎所有的程序中都有很广泛的应用,而在安卓APP中也不例外.一个APP的主线程主要承担着系统事件,输入事件,程序回调服务,UI 绘制等等操作,如果在主线程执行耗时较长的操作,就会阻碍主线程反应这些时间,造成卡顿现象甚至是无响应状态.所以这时候多线程就派上用场了.

在JAVA里面,多线程通常使用Thread和Runnable实现

Thread mythread = new Thread(){
    @Override
    public void run() {
        //要进行的操作
    }
}.start();

但是通常子线程完成工作后需要通知主线程自己已经完成工作,有时候还需要传输相关数据到主线程进行处理或显示,在安卓中这些异步操作该怎么实现呢?这时候Handler就派上用场了.下面直接通过代码进行说明和演示.

public class MainActivity extends AppCompatActivity {

    public static final int MSG = 0;

    private final MyHandler mHandler = new MyHandler(this);

    public Button button;
    public TextView textView;

    //定义一个继承Handler的静态内部类,实现handleMessage方法(必须实现)以处理从子线程返回的消息和数据
    private static class MyHandler extends Handler {

        //直接持有Activity容易产生内存泄漏.为防止内存泄漏,handler通过一个弱引用与Activity关联
        private WeakReference<MainActivity> mActivity;

        public MyHandler(MainActivity mainActivity) {
            mActivity = new WeakReference<>(mainActivity);
        }

        @Override
        public void handleMessage(Message msg) {
            //通过判断Message的what字段进行对应的操作,what是用户自行定义的一个int类型的字段
            switch (msg.what) {
                case MSG:
                    mActivity.get().textView.append(new Date().toGMTString() + "\nMessage Data arg1: " + ((String) msg.obj) + "\n");
                    break;
                default:
                    mActivity.get().textView.append("Undefine Message\n");
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.text);
        button = (Button) findViewById(R.id.run);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                for (int i = 1; i <= 5; i++) {
                    //子线程处理数据,可处理耗时较长的操作,如文件和网络IO,视频转码等等
                    final int l = i;
                    new Thread("ChildThread" + i) {
                        @Override
                        public void run() {
                            System.out.println("Thread \"" + currentThread().getName() + "\" is running");
                            Message message = new Message();
                            message.what = MSG;
                            //模拟子线程产生的数据,这里只简单的通过obj字段传输了一个简单的字符串,可通过setData()传输各种数据
                            //Bundle data = new Bundle();
                            //data.putXXX......
                            //message.setData(data);
                            message.obj = "Data from Thread " + currentThread().getName();
                            //延时发送消息,模拟各个线程处理时间的不同
                            mHandler.sendMessageDelayed(message, l * 500);
                        }
                    }.start();
                }
            }
        });
    }

}

运行截图:

这里写图片描述

通过Handler,我们就可以在子线程工作完成后通知主线程并把数据传回去进行后续操作.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值