java - AndroidTestCase 中永远不会调用 AsyncTask 的 onPostExecute()

标签 java android multithreading android-intent android-asynctask

我正在为我的 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 完成。

MyAsyncTaskonPostExecute() 回调中,我调用 signal.countDown()通知任务完成。

但是当我运行这个测试用例时,onPostExecute 从未被调用,为什么以及如何修复它?

========更新==========

runTest() 的最后一行添加 Thread.sleep(30*1000) 后,我可以看到更多来自网络操作的日志。它证明 teardown() 在我的网络操作完成之前被调用。我在 tearDown() 中什么也没做,android 测试框架。自动调用它。

似乎我使用 CountDownLatchwait-notify 不起作用...为什么?

最佳答案

因为我遇到了同样的问题...这就是为我解决的问题。 我没有让它扩展 AndroidTestCase,而是让它扩展了 InstrumentationTestCase。

然后我像这样启动 asyncTask:

runTestOnUiThread(new Runnable()
    {
        @Override
        public void run()
        {
            startAsyncTask();
        }
    });

关于java - AndroidTestCase 中永远不会调用 AsyncTask 的 onPostExecute(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19635308/

相关文章:

android - Android 和 iOS 的 Unity 命令行参数

java - 读取http请求时ContentLength变为-1

c++ - 如何取消 std::async 函数?

c++ - 服务器应用程序必须向 N 个客户端发出 ping 命令。有没有办法让它多线程?

java - 如何布置具有多个文本字段和确定、取消按钮的输入面板?

java - 即使数据库不存在,也可以使用 Hibernate 即时创建 PostgreSQL 数据库

java - PorterDuffXfermode DST_IN 未按预期工作

Java编码/解码一个字符串到/从一个长

android - 从 1 个 Intent 转到另一个 Intent 且数据来自服务器时,单击按钮时显示进度条

c++ - boost asio async_read 中的随机 EOF