Android多线程和异步消息的简单应用
2017-06-02 22:45
387 查看
多线程在几乎所有的程序中都有很广泛的应用,而在安卓APP中也不例外.一个APP的主线程主要承担着系统事件,输入事件,程序回调服务,UI 绘制等等操作,如果在主线程执行耗时较长的操作,就会阻碍主线程反应这些时间,造成卡顿现象甚至是无响应状态.所以这时候多线程就派上用场了.
在JAVA里面,多线程通常使用Thread和Runnable实现
但是通常子线程完成工作后需要通知主线程自己已经完成工作,有时候还需要传输相关数据到主线程进行处理或显示,在安卓中这些异步操作该怎么实现呢?这时候Handler就派上用场了.下面直接通过代码进行说明和演示.
运行截图:
通过Handler,我们就可以在子线程工作完成后通知主线程并把数据传回去进行后续操作.
在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,我们就可以在子线程工作完成后通知主线程并把数据传回去进行后续操作.
相关文章推荐
- Android多线程,异步消息处理机制, Thread, AsyncTask 简单总结
- android消息机制,异步和多线程
- Android-Socket多线程应用(聊天室客户端、Handler的简单使用)
- Android 异步消息处理简单理解
- Android 多线程 - 异步消息处理机制
- Android进阶——性能优化之多线程总结及简单应用(一)
- 【Android应用开发】-(20)简单的模拟按键发送消息
- Android之多线程----异步消息处理机制之Handler详解
- Android异步消息处理机制(一):简单使用
- Android多线程----异步消息处理机制之Handler
- 【Android应用开发】Instrumentation简单的模拟按键发送消息
- android多线程与界面交互以及runOnUiThread简单应用
- 简单粗暴理解android异步消息处理机制
- Android应用开发学习笔记之多线程与Handler消息处理机制
- android 多线程 异步消息处理 服务 学习笔记 (六)
- android消息机制,异步和多线程
- Android-Socket多线程应用(聊天室客户端、Handler的简单使用)
- android消息机制,异步和多线程
- Android多线程----异步消息处理机制之Handler详解
- Android多线程----异步消息处理机制之Handler详解