在android开发中UI线程不能进行耗时操作,需要开启线程进行操作。
项目结构:
ThreadPoolManager类主要是管理线程池
package cc.mnbase.task;
import android.util.Log;
import java.util.LinkedList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* User: 山野书生(1203596603@qq.com)
* Date: 2015-10-29
* Time: 14:10
* Version 1.0
* Info 线程池管理器
*/
public class ThreadPoolManager {
//线程池大小
private int poolSize = 0;
private final static int MIN_POOL_SIEZ = 1;
private final static int MAX_POOL_SIZE = 10;
//线程池
private ExecutorService threadPool;
//执行队列
private LinkedList<ThreadPoolTask> asyncTasks;
//工作方式
private int type;
//先进先出
public final static int TYPE_FIFO = 0;
//后进先出
public final static int TYPE_LIFO = 1;
private Thread poolThread;
private String tag = ThreadPoolManager.class.getSimpleName();
public ThreadPoolManager(int type, int poolSize){
this.type = (type==TYPE_FIFO)?TYPE_FIFO:TYPE_LIFO;
if(poolSize<MIN_POOL_SIEZ) poolSize = MIN_POOL_SIEZ;
if(poolSize>MAX_POOL_SIZE) poolSize = MAX_POOL_SIZE;
this.poolSize = poolSize;
threadPool = Executors.newFixedThreadPool(this.poolSize);
asyncTasks = new LinkedList<>();
}
/**
* 向任务队列中添加任务
* */
public void addAsyncTask(ThreadPoolTask task){
synchronized (threadPool){
Log.i(tag, "****addAsyncTask()****");
asyncTasks.add(task);
}
}
/**
* 从任务队列中提取任务
* */
private ThreadPoolTask getAsyncTask(){
synchronized (asyncTasks){
if(asyncTasks.size()>0){
ThreadPoolTask task = (this.type == TYPE_FIFO) ? asyncTasks.removeFirst() :
asyncTasks.removeLast();
Log.i(tag, "****getAsyncTask()****");
return task;
}
}
return null;
}
/**
* 开启线程池任务
* */
public void start(){
if(poolThread == null){
poolThread = new Thread(new PoolRunnable());
poolThread.start();
}
}
/**
* 关闭线程池,结束任务
* */
public void stop(){
poolThread.interrupt(); //中断
poolThread = null;
}
private class PoolRunnable implements Runnable{
@Override
public void run() {
try {
while(!Thread.currentThread().isInterrupted()){
ThreadPoolTask task = getAsyncTask();
if(task == null){
continue;
}
threadPool.execute(task);
}
} finally {
if(threadPool.isShutdown()){
threadPool.shutdown();
Log.i(tag, "***关闭线程池***");
}
}
}
}
}
ThreadPoolTask:抽象类,主要作用:执行耗时操作以及更新数据
package cc.mnbase.task;
/**
* User: 山野书生(1203596603@qq.com)
* Date: 2015-10-29
* Time: 14:14
* Version 1.0
*/
public abstract class ThreadPoolTask implements Runnable{
public abstract void updata(Object obj); //更新数据
public abstract Object loadData(); //加载数据
}
AsyncTask: 继承ThreadPoolTask,具体执行耗时操作以及更新数据
package cc.mnbase.task;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
/**
* User: 山野书生(1203596603@qq.com)
* Date: 2015-10-29
* Time: 14:52
* Version 1.0
*/
public abstract class AsyncTask extends ThreadPoolTask {
private String tag = AsyncTask.class.getSimpleName();
public AsyncTask(){
}
@Override
public void run() {
Object obj = loadData();
Message msg = handler.obtainMessage(0, obj);
handler.sendMessage(msg);
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 0:
updata(msg.obj);
break;
}
}
};
}
OK,具体用法:从assets文件夹获取图片
package cc.mnbase.fragment;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import java.io.IOException;
import java.io.InputStream;
import cc.mnbase.R;
import cc.mnbase.task.AsyncTask;
import cc.mnbase.task.ThreadPoolManager;
/**
* User: 山野书生(1203596603@qq.com)
* Date: 2015-10-29
* Time: 14:53
* Version 1.0
*/
public class AsyncTaskFragment extends BaseFragment {
private ThreadPoolManager poolManager;
private Button start_btn, stop_btn;
private ImageView img;
private String tag = AsyncTaskFragment.class.getSimpleName();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_async_task_layout, container, false);
return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
poolManager = new ThreadPoolManager(ThreadPoolManager.TYPE_FIFO, 5);
img = (ImageView)view.findViewById(R.id.img);
start_btn = (Button)view.findViewById(R.id.start_btn);
start_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
testTask();
}
});
stop_btn = (Button)view.findViewById(R.id.stop_btn);
stop_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
poolManager.stop();
}
});
}
private void testTask(){
AsyncTask task = new AsyncTask() {
@Override
public void updata(Object obj) {
Log.i(tag, "***加载完成***"+obj);
if(obj instanceof Bitmap){
img.setImageBitmap((Bitmap)obj);
}
}
@Override
public Object loadData() {
Log.i(tag, "***加载数据开始***");
Bitmap bitmap = null;
try {
InputStream is = getActivity().getAssets().open("img01.jpg");
bitmap = BitmapFactory.decodeStream(is);
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
};
poolManager.addAsyncTask(task);
poolManager.start();
}
}
简单布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始执行任务"
android:id="@+id/start_btn"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="结束任务"
android:id="@+id/stop_btn"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:id="@+id/img"
/>
</LinearLayout>
效果图: