最近研究别人的代码,看到其开多线程进行工作,并且将结果通过监听器的方式返回给UI线程,代码很管用,也容易理解,所以就先记下来
写一个接口做为监听器(WorkListener),里面可以有多个方法,用于对应子线程工作不同的事件,如onStart(),onResult(),onStop(),等待
写一个类(Work),在该类中写一个工作线程继承自Thread(WorkThread),在该WorkThread中写入用于工作线程的代码。
– 在Work类中添加一个HashSet()
private final Collection<WorkListener> listeners = new HashSet();
– 在Work类中添加addWorkListener(WorkListener)方法
public void addWorkListener(WorkListener listener) {
Collection var2 = this.listeners;
synchronized(this.listeners) {
this.listeners.add(listener);
}
}
– 在Work类中写一个抽象类继承自Runnable用在事件处理
private abstract class WorkEvent implements Runnable { private WorkEvent () { } public void run() { WorkListener[] emptyArray = new WorkListener[0]; WorkListener[] var2 = (WorkListener[]) this.listeners.toArray(emptyArray); int var3 = var2.length; for(int var4 = 0; var4 < var3; ++var4) { WorkListener listener = var2[var4]; this.execute(listener); } } protected abstract void execute(WorkListener listener); }
– 在Work类中根据需要写几个类继承自WorkEvent来实现各个事件,如ResultEvent
private class ResultEvent extends Work.WorkEvent { private final Object result; ResultEvent(Object result) { super(); this.result= result; } protected void execute(WorkListener listener) { listener.onResult(this.result); } }
– 在Work类中,创建一个Handler,用于将工作线程的数据发送到主线程
private final Handler mainHandler = new Handler(Looper.getMainLooper());
– 自此,监听器就写好了,接下来就是在工作线程(WorkThread)中利用监听器去传递各个事件(onResult,onStop等)了
WorkThread extends Thread {
public void run() {
...
String result="这是结果";
Work.this.mainHandler.post(Work.this.new ResultEvent(result));
...
}
}