Android学习第八周_使用率超高的多线程开发
来源:互联网 发布:销售类crm系统源码 编辑:程序博客网 时间:2024/06/06 00:24
1.线程的基本概念
线程就是一条工作线,就像工厂的流水线一样。而多线程就是多条线程同时工作。使用多线程的目的就是提高工作效率,保证系统不会出现卡顿现象。基本的原理是,cpu是按顺序执行的,但是由于其速度很多,程序中如果存在多个线程,cpu就可以在线程之间切换工作,因为速度快,所以看上去线程之间是同步执行的。
2.如何使用多线程
在android中多线程的原理和java多线程的原理类似,只是在原有的基础上多一些类进行了封装,所以使用起来会更加的方便。
- Main/UI Thread和Worker Thread
- Main/UI Thread和Worker Thread之间的通信
- Thread/Runnable
3.多线程
- Main/UI Thread和Worker Thread
- Main/UI Thread和Worker Thread之间的通信
- Thread/Runnable
- 线程安全
a.Activity.runOnUiThread(Runnable)
b.View.post(Runnable)
c.View.postDelay(Runnable,long) - Handler
- AsyncTask 同步代码块(synchronized block)
代码实现如下:
// Worker 线程 new Thread(new Runnable() { @Override public void run() { // 第一种 runOnUiThread(new Runnable() { @Override public void run() { mTextView.setText("我在其它线程中千辛万苦来看你……"); } }); // 第二种 mTextView.post(new Runnable() { @Override public void run() { mTextView.setText("我在其它线程中千辛万苦来看你……"); } }) ; // 第三种 mTextView.postDelayed(new Runnable() { @Override public void run() { mTextView.setText("我在其它线程中千辛万苦来看你……"); } },1000); // 第四种 new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { mTextView.setText("我在其它线程中千辛万苦来看你……"); } }); } }).start();//用AsynTaskL来处理class TestTask extends AsyncTask<Integer,Integer,String>{ @Override protected void onPreExecute() { // main thread ,before doInBackground(); mTextView.setText("加载中"); super.onPreExecute(); } @Override protected String doInBackground(Integer... params) { // worker thread // download parse xml data return String.valueOf(params[0] * 2 + 2); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); // main thread ,after doInBackground(); mTextView.setText("加载完成, 结果是:" + result); }}
4.new Thread()与ThreadPoolExecutor的对比
1.new Thread()的缺点
- 每次new Thread的新建对象性能差
- 线程缺乏统一的管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom
- 缺乏更多功能,如定时执行、定期执行、线程中断。
2.ThreadPoolExecutor的优点
- 提升性能。创建和小号对象费时费CPU资源
- 防止内存过度小号。控制活动线程的数量,防止并发线程过多
5.线程池
android中主要要用的线程池如下:
(1) newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程, 若无可回收,则新建线程。
(2) newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
(3) newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
(4) newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
6.Handler处理处理主线程与异步线程的交互
代码如下:
// update UI 在异步线程中发送消息 Message message = mHandler.obtainMessage(); message.obj = progress; message.what = 0; mHandler.sendMessage(message); //主线程中处理 @Override public void handleMessage(Message msg) { super.handleMessage(msg); MainActivity activity = mActivity.get(); switch (msg.what) { case 0: int progress = (int) msg.obj; activity.getProgressBar().setProgress(progress); activity.getTextView().setText("进度:" + progress + "%"); if(progress == 100){ Toast.makeText(activity, "download success", Toast.LENGTH_SHORT).show(); } break; }}
0 0
- Android学习第八周_使用率超高的多线程开发
- 性价比超高的51单片机学习板与开发板
- Android开发艺术探索_第八章
- 不止是Android,Github超高影响力开源大放送,学习开发必备教科书
- Android应用界面开发_学习笔记_第二周
- Android应用界面开发_学习笔记_第三周
- Android开发_多线程详解(九)
- 多线程_学习笔记_第七周
- 我的学习之路_第八章_map集合
- Android学习之路1_开发环境的搭建
- 操作系统的多线程技术_自我学习
- 多线程并发实践_笔记_第八章
- 我的学习之路_第十二章_多线程
- android的多线程学习
- geekband android #5 第八周分享(多线程)
- Android初级开发第八讲--ListView学习以及特性介绍
- 【Android开发学习笔记】【第八课】五大布局-下
- C++学习_多线程
- 搜狗用户查询日志(SogouQ)数据
- Angular2(Beta)入门
- DirectX-渲染到纹理
- Java中的基础----堆与栈的介绍、区别
- Linux下源码安装MySQL5.6.30
- Android学习第八周_使用率超高的多线程开发
- 关于改善js语言编程质量的个人小结之减少全局变量污染
- JS中的this、apply、call
- Java基础(十),流
- Unity序列化和持久化
- pcduino上用opencv的能出现的问题+解决方案
- CF #591 Div2 B.Rebranding(数组记录字母变化)
- FudionCharts简单学习记录
- 重装WIN7操作系统详细步骤