您的位置:首页 > 移动开发 > Android开发

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 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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: