android java 线程通信_Android 线程间通信
进程与线程的区别?
在Android中,线程是跑在进程之中的,当手机打开一个APP就相当于打开了一个进程,比如:UI界面的更新,就是在主线程中完成的,我也可以自定义一些子线程来完成所需要的任务.
如何创建线程?创建线程的几种方式?
1.创建一个类继承Thread类
2.创建一个类实现Runnable接口
什么是多线程?
线程是程序中一个单一的顺序控制流程,在程序中同是运行多个线程完成不同的工作,称为多线程
ANR的基础知识及产生?
ANR:application not responding :应用程序无响应
产生的情况:1.主要类型按键或触摸事件在特定的时间(5秒)内无响应
2.BroadcastReceiver在特定事件(10秒)内无法处理完成
3.小概率类型Service在特定事件内无法完成
线程的状态:
创建(new) ---->就绪(runnable)---->运行(running)---->阻塞(bloocked)----->消亡(dead)
当线程满足所需要运行的条件时,才能进入就绪状态
当线程就如就绪状态后,不能马上获得cpu的执行时间,需要CPU进行资源分配
当线程被中断后执行完毕才会被消亡
线程的生命周期
注意:多线程会导致CPU资源分配的增加导致系统繁忙
多线程示例:售票
packagecom.hejun.ticket;importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;public class MainActivity extendsAppCompatActivity {final static String TAG = "MainActivity";privateButton button;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=findViewById(R.id.strat_sale);
button.setOnClickListener(newView.OnClickListener() {
@Overridepublic voidonClick(View view) {
SaleTickets saleTickets1= new SaleTickets(4);
SaleTickets saleTickets2= new SaleTickets(3);
SaleTickets saleTickets3= new SaleTickets(2);
SaleTickets saleTickets4= new SaleTickets(2);
saleTickets1.setName("售票窗口1");
saleTickets2.setName("售票窗口2");
saleTickets3.setName("售票窗口3");
saleTickets4.setName("售票窗口4");
saleTickets1.start();
saleTickets2.start();
saleTickets3.start();
saleTickets4.start();
}
});
}private class SaleTickets extendsThread{private inttickets;private SaleTickets(inttickets){this.tickets =tickets;
}
@Overridepublic voidrun() {super.run();while(tickets>0){
Sale();
}
Log.d(TAG, Thread.currentThread().getName()+ "的票售卖完了");
}private voidSale(){
tickets--;
Log.d(TAG, Thread.currentThread().getName()+ "正在卖票,还剩下"+ tickets +"张票");
}
}
}
演示结果
线程间通信的相关组件
1.Message :消息.其中包含了消息ID,消息处理对象以及处理数据,Message有MessagesQueue统一列队,最终有Handle处理
2.Handle:处理者,负责Message的发送及处理,实现handleMessage(Message msg)方法,对特定的MEssage进行处理
3.MessagesQueue:消息队列,用来存放Handle发送过来的消息,并按照先进先出规则执行
4.Looper:消息泵,不断的从MessagesQueue中抽取Message执行,一个MessagesQueue需要一个Looper
5.Thread:线程,辅助调度整个消息循环,即消息循环执行的场所
关系:Handle looper MessagesQueue是简单的三角关系Looper和MessagesQueue是一一对应的
消息循环
一个Message经由Handle发送到MessagesQueue队列中,再由Looper不断的从MessagesQueue抽取,又再一次回到Handle的环抱,实现线程间的通信
线程与更新
在ui线程中,如果创建Handle是不传入Looper对象,那么将直接使用UI\线程的Looer对象(系统已经帮我们自动创建了),在其他线程创建Handle如果不传入Looper对象,那么Handle将不能接收处理消息,在这种情况下,通常的做法是:
在创建Handle之前,为该线程准备好一个Looper(Looper.prepare),然后让这个Looper跑起来(Looper.loop),这样Handle 才能正常工作;.
注意:Handle处理消息总是在创建Handler的线程中执行,而我们的消息处理,不乏UI的更新操作,不正确的线程直接更新UI将引发异常,因此,我们需要时刻关心Handler是在哪个线程中创建的.
SDk提供四中方式可以从其他线程中访问UI线程
1.Activity.runOnUiThread(Runnable)
2.View.post(Runnable)
3.View.postDelayed(Runnable,long)
4.Handler
案例,从网上下载图片并更新进度
packagecom.hejun.ticket;importandroid.annotation.SuppressLint;importandroid.app.ProgressDialog;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.os.Handler;importandroid.os.Message;importandroid.os.SystemClock;importandroid.os.Trace;importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;importandroid.widget.ImageView;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.HttpURLConnection;importjava.net.MalformedURLException;importjava.net.URL;public class DownPicture extendsAppCompatActivity {final static String address = "http://img4.imgtn.bdimg.com/it/u=1952016862,1880307894&fm=26&gp=0.jpg";private static final String TAG = "DownPicture";private Handler mMainHandler = null;private intprogress;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_down_picture);
Button button=findViewById(R.id.button);final ImageView imageView =findViewById(R.id.img);
button.setOnClickListener(newView.OnClickListener() {
@SuppressLint("HandlerLeak")
@Overridepublic voidonClick(View view) {final ProgressDialog progressDialog = new ProgressDialog(DownPicture.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("下载中");
progressDialog.setMax(100);
progressDialog.show();new Thread(new Down(),"下载图片").start();
mMainHandler= newHandler(){
@Overridepublic voidhandleMessage(Message msg) {super.handleMessage(msg);switch(msg.what){case 10010:
progressDialog.setProgress(msg.arg1);break;case 10011:
progressDialog.dismiss();
Bitmap bitmap=(Bitmap) msg.obj;
imageView.setImageBitmap(bitmap);break;
}
}
};
}
});
}class Down implementsRunnable {
String fileName= "dowmPicture";
@Overridepublic voidrun() {try{
URL url= newURL(address);
HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(5000);
httpURLConnection.setRequestMethod("GET");if (httpURLConnection.getResponseCode() ==HttpURLConnection.HTTP_OK) {
InputStream inputStream=httpURLConnection.getInputStream();
OutputStream outputStream=openFileOutput(fileName, MODE_PRIVATE);byte[] bytes = new byte[1024*1024];int s =httpURLConnection.getContentLength();int d = 0;int curent = 0;while ((d = inputStream.read(bytes)) != -1){
outputStream.write(bytes,0,s);
curent+=d;
progress= (int) ((float)curent/s*100);
Log.d(TAG,"当前现在进度为" +progress);
SystemClock.sleep(40);
Message message= newMessage();
message.arg1=progress;
message.what= 10010;
mMainHandler.sendMessage(message);
}if (progress == 100){
Bitmap bitmap=BitmapFactory.decodeFile(getFileStreamPath(fileName).getAbsolutePath());
Message message= newMessage();
message.obj=bitmap;
message.what= 10011;
mMainHandler.sendMessage(message);
}
inputStream.close();
outputStream.close();
httpURLConnection.disconnect();
}
}catch(MalformedURLException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
android java 线程通信_Android 线程间通信相关推荐
- android组建之间通信_android组件间通信有哪些方式
四大组件以及通讯机制: activity (1)一个Activity通常就是一个单独的屏幕(窗口). (2)Activity之间通过Intent进行通信. (3)android应用中每一个Activi ...
- handler回调主线程_Android使用Handler实现子线程与子线程、子线程与主线程之间通信...
转载:https://blog.csdn.net/shaoenxiao/article/details/54561753 今天这篇文章只讲一下怎么使用Handler实现子线程与子线程之间.子线程与主线 ...
- vue中子组件和子组件之间怎么通信_Vue组件间通信6种方式
摘要: 总有一款合适的通信方式. Fundebug经授权转载,版权归原作者所有. 前言 组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用 ...
- 容器间通信_Vue组件间通信的6种方式,前端工程师人人都会,网友:太简单了...
Vue 组件间通信只要指以下 3 类通信:父子组件通信.隔代组件通信.兄弟组件通信,下面分别介绍每种通信方式且会说明此种方法可适用于哪类组件间通信. (1)props / $emit 适用 父子组件通 ...
- android java rsa加密_Android RSA与Java RSA加密不一样标准产生问题的解决方法
最近作一个基于android的客户端,客户端与Java服务器 (MyEclipse自带的Tomcat服务器)的通讯须要实施安全方案.而本人是使用非对称密钥来对数据进行加密的,客户端用公钥加密,服务器用 ...
- android应用组件安全,基于组件间通信的Android应用安全分析
Android application security analysis based on inter-component communication Huang Yanyi 1 黄炎裔(1994- ...
- android java服务端_Android/Java从服务器端下载图片
/** * 思想: 1.直接将所有数据安装字节数组发送 2.对象序列化方式 *//** * thread方式 * * @author Administrator */public class Test ...
- android java 录音放大_Android实现录音功能实现实例(MediaRecorder)
本文介绍了Android实现录音的实例代码(MediaRecorder),分享给大家,具体如下: Android提供了两个API用于录音的实现:MediaRecorder 和 AudioRecord, ...
- android java 中文乱码_android读写中文如何避免乱码详解
前言 android读取文件中文出现乱码的原因无非就是,读取文件的字符格式与写如文件的格式不一致.因此,避免中文乱码,要在写入文件的时候按照一定的格式写入,读取的时候按照一定的格式读取.这样对应就不会 ...
最新文章
- php localcompare,JS中使用sort结合localeCompare实现中文排序实例_javascript技巧
- 从 Flutter 的视频渲染到 App 落地经验
- R把天数据按照不同时间粒度聚合数据(Aggregate)
- oracle收集统计信息sql,Oracle自动统计信息的收集原理及实验
- matlab字母随机排列,matlab实现1n整数的一个随机排列
- 遇见好链接(我还并没有看)
- mysql数据库binlog日志截断报错,导致mysql主从同步失败故障排查
- Building Apps for Windows Phone 8.1教程下载地址整理
- Cortex M3/M4 学习摘要(二)
- java开发冒险岛系统实训报告_樱妖冒险岛079完美源码
- 车林通购车之家--购车计算器模块--算法js
- exe图标修改器和EXE文件打不开了的办法
- “33岁,阿里程序员,税后年薪170万,我征婚有要求,有错吗?”
- FS00702型酒精传感器
- Windows 下编译 OpenSSL
- 如何让好习惯成为你人生中的一部分
- HTML之表格与表单
- python逆向爬取网易云评论进行情感分析!网易评论才是高手
- 2022新版PMP考试有哪些变化?
- 29(将数字字符串转换成数字)
热门文章
- ubuntu找不到ens33问题排查
- NUC972 使用不同的FLASH开机的ENV文件写法 NAND...
- 准确率、精度和召回率
- Multi-task learning of facial landmarks and attributes with Tensorflow(一)
- ubuntu机械盘写入cannot be copied because you do not have permissions to create it in the destination.
- 微信小程“古康日记“
- Redis与传统sql数据库的区别
- The producer group has been created before
- MySQL——基础知识总结超详细版本(一)
- 基于MATLAB的数字图像处理基本操作