在多人开发中,总想说把一个模块写得尽量高内聚,尽量功能模块化,而与其他的功能之家的耦合度尽量的低。所以就花了点时间自己写了个类似的事件总线的框架,当然还有很多不足。请到我的顺便把源码发上来,大家可以帮忙一起修改。
TaskManager.java 对任务进行队列管理
TaskManager.java 对任务进行队列管理
public
class TaskManager {
private
static
int NUMBER_OF_CORES
=
Runtime.getRuntime()
.availableProcessors();
private
static TaskManager taskManager;
private
static ThreadPoolExecutor mDecodeThreadPool;
// 设置一个线程可闲置的时间
private
static
final
int KEEP_ALIVE_TIME
=
1;
// 设置一个线程可闲置的时间的单位
private
static
final TimeUnit KEEP_ALIVE_TIME_UNIT
= TimeUnit.SECONDS;
// 声明一个任务队列
private BlockingQueue
<
Runnable
> mDecodeWorkQueue;
public
static TaskManager getTaskManager() {
if (
null
== taskManager) {
taskManager
=
new TaskManager();
}
return taskManager;
}
public
int getQueueSise() {
if (
null
!= mDecodeWorkQueue) {
return mDecodeWorkQueue.size();
}
return
0;
}
public TaskManager() {
mDecodeWorkQueue
=
new LinkedBlockingQueue
<
Runnable
>();
mDecodeThreadPool
=
new ThreadPoolExecutor(NUMBER_OF_CORES,
// 线程池的初始线程数量
NUMBER_OF_CORES,
// 线程池的最大线程数量
KEEP_ALIVE_TIME, KEEP_ALIVE_TIME_UNIT, mDecodeWorkQueue);
}
public
synchronized
void addTask(FerrisTaskRunble task)
throws
NullPointerException{
try {
if (
null
== mDecodeWorkQueue) {
mDecodeWorkQueue
=
new LinkedBlockingQueue
<
Runnable
>();
}
if (task
!=
null) {
if (mDecodeWorkQueue.size()
<=
600) {
mDecodeWorkQueue.add(task);
}
}
}
catch (
Exception e) {
// TODO: handle exception
}
}
// 完成任务后将它从任务队列中删除
public
synchronized
void finishTask(FerrisTaskRunble task)
throws
NullPointerException{
try {
if (
null
== mDecodeWorkQueue) {
return;
}
if (task
!=
null) {
mDecodeWorkQueue.remove(task);
}
}
catch (
Exception e) {
// TODO: handle exception
}
}
// 取得一项待执行任务
public
synchronized
void goTaskManager()
throws
NullPointerException {
try {
if (
null
== mDecodeWorkQueue) {
mDecodeWorkQueue
=
new LinkedBlockingQueue
<
Runnable
>();
}
FerrisTaskRunble task
=
null;
if (
!mDecodeWorkQueue.isEmpty()) {
task
= (FerrisTaskRunble) mDecodeWorkQueue.poll();
// 执行完任务后把改任务从任务队列中移除
if (
null
!= task) {
mDecodeThreadPool.execute(task);
}
}
}
catch (
Exception e) {
// TODO: handle exception
}
}
}
package com.ferris.sync;
public
class FerrisTaskRunble
implements
Runnable {
private RequestVo requestVo;
public FerrisTaskRunble(RequestVo requestVo) {
this.requestVo
= requestVo;
}
@
Override
public
void run()
throws
NullPointerException {
// TODO Auto-generated method stub
if (requestVo
!=
null) {
Object tempobject
= requestVo.taskParamBase.getParam(requestVo);
if (tempobject
!=
null) {
if (requestVo.ferrisTaskListemer
instanceof FerrisTaskListemer
&& requestVo.ferrisTaskListemer
!=
null) {
requestVo.ferrisTaskListemer.updata(tempobject);
}
}
}
}
}
RequestVo.java 请求内容的对象 可以将
上下文
事件的ID
请求数据
以及事物处理的类
结果监听(在UI线程进行回调)
public
class RequestVo {
public Context context;
//上下文
public
int event;
//请求的事件
public
Object requestData;
//请求的数据
public TaskParamBase
<?
> taskParamBase;
//事务处理
public FerrisTaskListemer ferrisTaskListemer;
//结果监听
public RequestVo(){
}
public RequestVo(
int event,Context context,
Object requestData,TaskParamBase
<?
> taskParamBase,FerrisTaskListemer ferrisTaskListemer){
this.context
=context;
this. event
=event;
this.requestData
=requestData;
this.taskParamBase
=taskParamBase;
this. ferrisTaskListemer
=ferrisTaskListemer;
}
public Context getContext() {
return context;
}
public
void setContext(Context context) {
this.context
= context;
}
public
int getEvent() {
return event;
}
public
void setEvent(
int event) {
this.event
= event;
}
public
Object getRequestData() {
return requestData;
}
public
void setRequestData(
Object requestData) {
this.requestData
= requestData;
}
public TaskParamBase
<?
> getTaskParamBase() {
return taskParamBase;
}
public
void setTaskParamBase(TaskParamBase
<?
> taskParamBase) {
this.taskParamBase
= taskParamBase;
}
public FerrisTaskListemer getFerrisTaskListemer() {
return ferrisTaskListemer;
}
public
void setFerrisTaskListemer(FerrisTaskListemer ferrisTaskListemer) {
this.ferrisTaskListemer
= ferrisTaskListemer;
}
}
其他代码请自己看。。。。。
MainActivity.java UI主线程 调用。
public
class MainActivity
extends Activity {
private FerrisTaskRunble ferrisTask;
private TaskManager mTaskManager;
private TextView textView1;
private
int cout
=
0;
@
Override
protected
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTaskManager
=TaskManager.getTaskManager();
textView1
=(TextView)findViewById(R.id.textView1);
for(
int i
=
0;i
<
5000;i
++){
//在UI主线程 新建请求任务,
RequestVo requestVo
=
new RequestVo(
1,
this,
"mytest"
+cout,
new
MainTask
(),
new mTaskListem());
ferrisTask
=
new FerrisTaskRunble(requestVo);
//参数传入
mTaskManager.addTask(ferrisTask);
//添加任务
requestVo
=
null;
cout
+=
1;
}
mTaskManager.goTaskManager(); //开始执行任务(可以多次调用,只返回一个实例)
}
/**
* 监听任务回调结果,更新UI
*
@ferris
Administrator
*
*/
public
class mTaskListem
implements FerrisTaskListemer{
@
Override
public
synchronized
void updata(
Object object) {
// TODO Auto-generated method stub
textView1.setText((
String)object);
}
}
}
MainTask.java 这个是我们的执行耗时的类,在线程中。
package com.ferris.thingsbus;
import com.ferris.sync.RequestVo;
import com.ferris.sync.TaskParamBase;
public
class MainTask
extends TaskParamBase
<
Object
> {
@
Override
public
Object getParam(RequestVo requestVo) {
// TODO Auto-generated method stub
return requestVo.requestData; //这里可以进行耗时操作,访问网络请求数据等。 return结果将会更新到UI层
}
}