【发布时间】:2015-10-10 07:34:27
【问题描述】:
我对通用线程框架的使用(当然对于特定数量的作业)与许多异步任务的使用有一些疑问。
我想知道是否最好为小型作业设置许多异步任务,当作业需要更长的时间时使用处理程序线程,或者最好有一个通用线程自己拥有通用作业和构建在顶部的通知系统正在运行的线程(或子类,同样的故事)。
我的想法是创建处理不同作业的线程,而无需事先知道哪些作业。这朝着创建一种用于处理不同通用作业的小型框架的方向发展。
例如,我的方法朝着下面的代码方向发展:
public (abstract if you want to extend and add something on top) class WorkerThread extends Thread {
private static final String TAG = WorkerThread();
private List<WorkTask> syncQueue = new ArrayList< WorkTask >();
private boolean clearQueue = false;
public WorkerThread() {
}
public void stop(boolean clear) {
clearQueue = clear;
this.stopWorker = true;
}
public void addTask(WorkerTask task) {
synchronized (syncQueue) {
if (task != null && !getSynQueue().contains(task)) {
getSynQueue().add(task);
}
}
}
@Override
public void run() {
while (!stopWorker) {
WorkerTask task = null;
synchronized (syncQueue) {
if (!getSynQueue().isEmpty()) {
task = getSynQueue().get(0);
}
}
if (task != null) {
try {
task.run();
synchronized (syncQueue) {
if (!getSynQueue().isEmpty()) {
getSynQueue().remove(task);
//notify something/someone
}
}
} catch (Exception e) {
Log.e(TAG, "Error in running the task." + e.getMessage());
synchronized (syncQueue) {
//again u can notify someone
}
} finally {
//here you can actually notify someone of success
}
}
}
if(clearQueue){
getSynQueue().clear();
}
}
private List<WorkerTask> getSynQueue() {
return this.syncQueue;
}
}
这里的任务是所有作业扩展的抽象基类。
然后在这个线程或这个类的子类之上可以是一个观察者,它在作业/任务出现问题时通知。
到目前为止,据我所知,我的方法的优缺点如下:
Thread:
优点:
1.长时间操作。
2. 集中化。
3. 可扩展。
4. 正确测试后,它将顺利运行。
缺点
1. 复杂的架构。
2. 难以维护。
3. 过度设计小工作。
异步任务:
优点
1、使用方便。
2. 适合短时间操作的工作。
3. 易于维护/理解。
缺点
1. 不能扩展那么多,你需要坚持 doInBackground 和 onPostExecute。
2.不适合长时间操作的工作。
如果我遗漏了什么,请纠正我。
最后一个问题是,当架构变得有点大,有很多请求时,短时间,长时间,尝试制作一个可以同时处理它的通用框架而不是在那里使用异步任务来做不是更好吗,也许其他部分的handlerthread等?
【问题讨论】:
标签: android multithreading generics android-asynctask