这种模仿AsyncTask功能的模式有什么问题?:
// on the UI thread
final CountDownLatch latch = new CountDownLatch(1);
onPreexecuteWrapper();
new Thread(new Runnable() {
doInBackgroundWrapper();
latch.countDown();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
latch.await();
} catch (InterruptedException e) {
Logger.error(TAG, "Not good.");
}
context.runOnUiThread(new Runnable() {
@Override
public void run() {
onPostExecuteWrapper();
}
});
}
}).start();我认为这是错误的:
发布于 2015-06-26 08:02:56
第一件事情是错误的,那就是你正在重新发明一个轮子。
第二,为什么不放弃CountDownLatch,直接在第一个可运行的地方执行context.runOnUiThread呢?
// on the UI thread
onPreexecuteWrapper();
new Thread(new Runnable() {
@Override
public void run() {
doInBackgroundWrapper();
context.runOnUiThread(new Runnable() {
@Override
public void run() {
onPostExecuteWrapper();
}
});
}
}).start();最后一件事是,与其生成新线程,不如使用Executor和ThreadPool。
发布于 2015-06-26 21:47:37
看起来很臭??很臭..。
我感到奇怪的第一件事是压痕:
@覆盖公共void (){ try { latch.await();}InterruptedException e) {Logger.error(标记,“不好”);}context.runOnUiThread(新的Runnable() {
这段代码给人一种错误的印象,认为它在捕获InterruptedException之后就停止了。
应该是这样的:
@Override
public void run() {
try {
latch.await();
} catch (InterruptedException e) {
Logger.error(TAG, "Not good.");
}
context.runOnUiThread(new Runnable() {擦伤那个..。首先,让我们在甲骨文“并发要点”中阅读:
中断是对线程的指示,它应该停止它正在做的事情,并做一些其他的事情。
无论你做什么,InterruptedException基本上都是一滴。在那之后继续执行基本上是没有意义的。这意味着catch块应该更符合.
} catch (InterruptedException e) {
logger.warning("Got interrupted while waiting on latch");
Thread.currentThread().interrupt();
}再一次,这里提出的整个结构似乎是一种过于复杂的方式来实现目标。
而不是不必要地创建线程。要完成任务,你应该有一个人把你所拥有的工作交给他们的一些人。
棘轮怪的答案中提到的解决方案已经存在
https://codereview.stackexchange.com/questions/94751
复制相似问题