android 线程池的封装,android里的线程 AsyncTask(封装了Thread和Handler,采用了线程池),IntentService, HandlerThread和线程池...

android里的线程 AsyncTask(封装了Thread和Handler,采用了线程池),IntentService, HandlerThread和一些常用的线程池

线 程

1.AsyncTask

有采用线程池,封装了Thread和Handler

采用ThreadPoolExecutor线程池:

public abstract class AsyncTask

/** * An {@link Executor} that can be used to execute tasks in parallel. */

public static final Executor THREAD_POOL_EXECUTOR;

static {

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(

CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,

sPoolWorkQueue, sThreadFactory);

threadPoolExecutor.allowCoreThreadTimeOut(true);

THREAD_POOL_EXECUTOR = threadPoolExecutor;

}

实际项目中怎么用AsyncTask?

0818b9ca8b590ca3270a3433284dd417.png

**如图:模拟了一个下载文件的任务**

现在开始表演:

package com.yw.threaddemo;

import android.app.Dialog;

import android.app.ProgressDialog;

import android.content.Context;

import android.os.AsyncTask;

import android.view.View;

import android.widget.TextView;

/** * Created by yw on 17/10/25. * author jackyang * com.yw.threaddemo */

public class AsyncTaskDemo extends AsyncTask {

private Context mContext;

private View mView;

private Dialog mDialog;

public AsyncTaskDemo(Context context, View view) {

this.mContext = context;

this.mView = view;

}

@Override

protected void onPreExecute() {

//在ui线程中执行,ps:先弹一个加载框 表示你正在处理

super.onPreExecute();

mDialog =

new ProgressDialog(mContext);

mDialog.setTitle("我是一个等待Dialog");

mDialog.setCancelable(false);

mDialog.show();

}

@Override

protected void onPostExecute(String s) {

//在ui线程中执行

super.onPostExecute(s);

mDialog.dismiss(); //关闭加载框

((TextView)mView).setText(s);

}

@Override

protected void onProgressUpdate(Integer... values) {

//当进度发生改变时,在ui线程中执行

super.onProgressUpdate(values);

//模拟 进度

((TextView)mView).setText("下载的进度是" + values[0] + "/10");

}

@Override

protected void onCancelled(String s) {

//在ui中执行,当任务被取消时执行

super.onCancelled(s);

}

@Override

protected String doInBackground(String... params) {

//在子线程中执行 返回result onPostExecute得到回调的结果

try {

// Thread.sleep(10000); //模拟task

for (int i = 0; i < 10; i++) {

publishProgress(new Integer(i));

Thread.sleep(1000);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

return "我是返回的数据";

}

}

主线程里创建和执行task

new AsyncTaskDemo(this, tv_show_result).execute("yw"); //创建和执行task

注意事项:

AsyncTask必须在主线程里创建

execute()必须在主线程里调用

源码下载地址

2.HandlerThread

继承Thread,可以使用handler的Thread;run()方法里会Looper.prepare()创建一个消息队列,并且开启消息循环Looper.loop();

public class HandlerThread extends Thread {

.

.

.

@Override

public void run() {

mTid = Process.myTid();

Looper.prepare();

synchronized (this) {

mLooper = Looper.myLooper();

notifyAll();

}

Process.setThreadPriority(mPriority);

onLooperPrepared();

Looper.loop();

mTid = -1;

}

.

.

.

}

3.IntentService

采用了HandlerThread

public abstract class IntentService extends Service . . . @Override public void onCreate() {

// TODO: It would be nice to have an option to hold a partial wakelock

// during processing, and to have a static startService(Context, Intent)

// method that would launch the service & hand off a wakelock.

super.onCreate();

HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");

thread.start();

mServiceLooper = thread.getLooper();

mServiceHandler = new ServiceHandler(mServiceLooper);

.

.

.

}

来一个例子吧

首先实现一个具体的 Service

package com.yw.threaddemo;

import android.app.IntentService;

import android.content.Intent;

import android.util.Log;

/** * Created by yw on 17/10/25. * author jackyang * com.yw.threaddemo */

public class IntentServiceDemo extends IntentService {

/** * Creates an IntentService. Invoked by your subclass's constructor. * *@param name Used to name the worker thread, important only for debugging. */

public IntentServiceDemo(String name) {

super(name);

}

public IntentServiceDemo() {

super("yw");

}

@Override

protected void onHandleIntent(Intent intent) {

String hint = intent.getStringExtra("hint");

Log.d("yw", hint);

}

@Override

public void onDestroy() {

Log.d("yw", "onDestroy");

super.onDestroy();

}

}

然后在Activity里调用

startService(Intent intent)

Intent i = new Intent(this, IntentServiceDemo.class);

i.putExtra("hint", "666");

startService(i);

i.putExtra("hint", "777");

startService(i);

log如下

0818b9ca8b590ca3270a3433284dd417.png

从日志中看到onDestroy方法只执行了一次, why?

* @see android.os.AsyncTask

*/

public abstract class IntentService extends Service {

private volatile Looper mServiceLooper;

private volatile ServiceHandler mServiceHandler;

private String mName;

private boolean mRedelivery;

private final class ServiceHandler extends Handler {

public ServiceHandler(Looper looper) {

super(looper);

}

@Override

public void handleMessage(Message msg) {

onHandleIntent((Intent)msg.obj);

stopSelf(msg.arg1); //源码中发现该方法,他会根据队列的里的服务是否都执行完了,再判断是否停止该服务

}

}

.

.

.

}

demo下载地址

线程池

避免线程的重复创建和销毁,从而减小内存的消耗

ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue workQueue,

ThreadFactory threadFactory) {

this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,

threadFactory, defaultHandler);

}

FixedThreadPool

*Executors.class*

public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {

return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), threadFactory);

}

CachedThreadPool

*Executors.class*

public static ExecutorService newCachedThreadPool() {

return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS, new SynchronousQueue());

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值