Android多线程和异步消息的简单应用
来源:互联网 发布:热血战歌源码 编辑:程序博客网 时间:2024/06/05 03:57
多线程在几乎所有的程序中都有很广泛的应用,而在安卓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
- Android多线程和异步消息的简单应用
- Android多线程和异步消息的简单应用
- android消息机制,异步和多线程
- android消息机制,异步和多线程
- android消息机制,异步和多线程
- [转]android消息机制,异步和多线程
- android消息机制,异步和多线程
- Android异步消息处理和应用
- Android多线程,异步消息处理机制, Thread, AsyncTask 简单总结
- Android多线程异步处理消息
- 消息机制,异步和多线程
- 消息机制,异步和多线程
- 消息机制,异步和多线程
- Study on Android【六】--消息机制,异步和多线程
- Android异步消息处理(一)--》Handler和多线程深入
- Android服务(包括多线程和异步消息处理)
- Android 异步和多线程
- Android 异步消息处理简单理解
- 输出素数
- 只会写代码没有什么厉害的,关键是理解他的原理
- 逆序输出字符串
- Yii2用Gii自动生成Module+Model+CRUD
- PHP-Heredoc用法:<<<EOFEOF;
- Android多线程和异步消息的简单应用
- MySQL Explain详解
- 疯狂Android讲义(第3版)学习笔记(第二章---界面编程)
- 85 C语言宏参数的字符串化和宏参数的连接
- 虚拟机VMware Ubuntu系统与Windows文件共享的各种方法
- 结对编程和TDD(测试驱动开发)
- kotlin初学
- ThreaLocal深度剖析
- 你真的了解AsyncTask?