Android多线程间通信
来源:互联网 发布:软件开发语言培训 编辑:程序博客网 时间:2024/06/07 11:53
一 概述
上一篇我们介绍了 java多线程Android 多线程的前世之java多线程初探,建议没了解的可以去看一看,那么接下来可能有朋友说。那么我们用java多线程的方式,在Android内使用可不可以呢?毕竟我们Android系统也是基于Java语言编写的。好的,我们现在就试试
二 分析验证
先看下根据java方式创建的线程
package com.nanjing.test.myapplication;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.TextView;public class MainActivity extends AppCompatActivity {private TextView mTv; private int mt=10;// private Handler mhandler=new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTv=(TextView)findViewById(R.id.time); new Thread(new MyRunnable()).start(); } private class MyRunnable implements Runnable{ @Override public void run() { if(mt>0){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } mt--; mTv.setText(mt+""); } } }}很简单 利用实现runnable的方式,实现了多线程,当我们运行的时候出现下图错误;
这时候Handler就出现了。它的作用就是专门处理线程间的信息传递的,所以我们改下上面的代码
public class MainActivity extends AppCompatActivity { private TextView mTv; private int mt = 10; private Handler mhandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); mTv.setText(msg.arg1+""); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTv = (TextView) findViewById(R.id.time); new Thread(new MyRunnable()).start(); } private class MyRunnable implements Runnable { @Override public void run() { while (mt > 0) { try { Thread.sleep(1000); Message msg=Message.obtain(); mt--; msg.arg1=mt; mhandler.sendMessage(msg); } catch (InterruptedException e) { e.printStackTrace(); } } } }}对比上面的代码 ,我们可以看出,我们都是通过实现runnable接口,实现多线程,但是在run方法里,我们通过handler.sendMessage方法传递消息,然后回调到主线程,主线程收到消息就开始处理。这样我们在Android里也就实现了线程间的通信。
三 引申
上面我们通过handler实现了消息之间的传递,其实handler还有其他的方法obtainMessage,sendMessageAtTIme,post等等各种变体方法。我们主要来看看post方法,handler.post用的比较多的是定时处理时发送的消息,注意,这种方式就不是,通过子线程发送消息给主线程了。其实他还是在主线程里发送消息给主线程。 private Handler mhandler=new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTv = (TextView) findViewById(R.id.time);
//每秒钟,实现一次runnable mhandler.postDelayed(new Runnable() { @Override public void run() { if(mt>0){ mt--; mTv.setText(mt+"");
//在执行一次 mhandler.postDelayed(this,1000); } } },1000); }通过测试,也能实现效果。在这里我们可以看到同时使用到两次hadler发送消息,因为间隔一秒中在发送一次,所以实现了循环更新。
四 总结
通过上面的简单分析,我们弄清楚了Android多线程的基本操作及Handler.因为是通信模块,所以没有根据源码分析,如果觉得小编说的肤浅可以参考源码。以上就是本系列的第一篇章,水平有限,不吝赐教。我们我们。。
0 0
- Android多线程间通信
- Android 多线程通信Handler
- Android 多线程通信 Handler
- Android多线程通信机制
- Android 多线程及线程通信
- Android Bound Service 多线程通信
- Android 多线程及线程通信
- Android 多线程及线程通信
- 多线程线程间通信
- javaSE-多线程间通信
- MFC 多线程间通信
- qt多线程间通信
- 多线程间的通信
- ios 多线程间通信
- 多线程在Android中的应用以及线程间的通信
- 多线程编程--多线程间通信(五)
- 多线程(三)--多线程间通信
- Android --- Handler 多线程通信示例(ProgressBar)
- 克服跨洋网络延迟,使用Docker Hub Mirror加速Docker官方镜像下载
- [bsoj1035] 点和线
- maven类型的web工程本地调试办法
- C#打开文件 ,文件夹
- 【codeforces 758B】Blown Garland
- Android多线程间通信
- 继承和派生
- 2017美国数学建模MCM A题(连续型)翻译 管理赞比西河 Managing The Zambezi River
- manacher板子
- 关于Trie KMP AC自动机
- [bsoj1922] 机器蛇
- Android studio之代码注释
- android_85_自定义View
- ftp 自动登录下载解压导入excel