Android学习第八周_使用率超高的多线程开发
2016-04-24 11:16
531 查看
1.线程的基本概念
线程就是一条工作线,就像工厂的流水线一样。而多线程就是多条线程同时工作。使用多线程的目的就是提高工作效率,保证系统不会出现卡顿现象。基本的原理是,cpu是按顺序执行的,但是由于其速度很多,程序中如果存在多个线程,cpu就可以在线程之间切换工作,因为速度快,所以看上去线程之间是同步执行的。2.如何使用多线程
在android中多线程的原理和java多线程的原理类似,只是在原有的基础上多一些类进行了封装,所以使用起来会更加的方便。- Main/UI Thread和Worker Thread
- Main/UI Thread和Worker Thread之间的通信
- Thread/Runnable
3.多线程
Main/UI Thread和Worker ThreadMain/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; } }
相关文章推荐
- Android控件之View的事件分发机制探索
- Android控件篇之视图控件scrollview探索
- 初步了解响应式框架——agera
- Android中的Intent对象完全解析
- 【整理自慕课网】Android动感系列-扫一扫 ZXing
- android Webview中注入js,用于解决第三方页中出现返回事件window.history.go(-1),无法响应问题
- 加速Android Studio/Gradle构建
- Android AIDL 进程之间的通信
- Xamarin.Android之布局文件智能提示问题
- Android中调用系统的文件浏览器及自制简单的文件浏览器
- Android学习(42) -- 自定义控件(6)下拉选择实现( 动态ListView + popupWindow)
- 举例讲解Android应用中SimpleAdapter简单适配器的使用
- android绘图常用方法归纳
- Android Wifi开发
- Android Studio下的应用性能优化总结-内存优化
- Android项目中如何用好构建神器Gradle?
- 将Eclipse代码导入到AndroidStudio的两种方式
- android仿win8
- android文件存储
- Android 5.X 新特性