【发布时间】:2013-11-07 06:07:59
【问题描述】:
我正在为我的Android项目编写一个非常简单的单元测试用例,测试用例简单地执行一个AsyncTask,它在后台进行网络操作。我正在为我的测试用例扩展 AndroidTestCase 类:
public class MyTest extends AndroidTestCase{
//use CountDownLatch to perform wait-notify behavior
private CountDownLatch signal;
@Override
public void setUp() throws Exception{
super.setUp();
//I use CountDownLatch to perform wait-notify behaviour
signal = new CountDownLatch(1);
}
@Override
public void runTest() throws Exception{
String params = "some params";
//MyAsyncTask does the networking tasks
new MyAsyncTask().execute(params);
//wait until MyAsyncTask is done
try {
signal.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private class MyAsyncTask extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... params) {
//Do networking task e.g. access a remote database
}
@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
//this never get called when run this test case, why?
Log.i("Debug","post execute");
signal.countDown();
}
}
}
正如你在上面看到的,我正在使用CountDownLatch 来执行等待通知行为。
在MyAsicTask 启动后,我调用signal.await() 来等待让MyAsyncTask 完成。
在MyAsyncTask的onPostExecute()回调中,我调用signal.countDown()来通知任务完成。
但是当我运行这个测试用例时,onPostExecute 永远不会被调用,为什么以及如何解决它?
========更新==========
在runTest() 的最后一行添加Thread.sleep(30*1000) 后,我可以看到更多来自网络操作的日志。它证明teardown() 在我的网络操作完成之前被调用。我在 Android 测试框架 tearDown() 中什么也没做。自动调用它。
似乎我的 wait-notify 使用 CountDownLatch 不起作用...为什么?
【问题讨论】:
-
doInBackground 有异常吗?
-
doInBackground可能出现问题,因此onPostExecute没有接到电话.. -
@d3m0li5h3r 除非 doInbackground() 崩溃并取消异步任务,否则 onPostExecute() 不可能不会执行。
-
@Brontok.. 这正是我的意思.. 要么他在
doInBackground中收到异常,要么任务已通过调用cancel()方法被取消。 -
大家好,doInBackgroud()也不例外,tearDown()是在网络操作进行时调用的.....我使用CountDownLatch的目的是为了避免这种情况,但是它仍然会发生,为什么?
标签: java android multithreading android-intent android-asynctask