java - 处理程序未在 Instrumentation Test 中执行 Runnable
问题描述
我编写了一个 Android 仪器测试,它调用我的服务并通过广播接收答案。
与服务对话的要测试的代码使用处理程序。
在测试我的测试过程中 ^^ 我注意到处理程序的行为不符合预期。所以我写了一个测试来检查这种行为:
import android.os.Handler;
import android.support.test.annotation.UiThreadTest;
import org.junit.Assert;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@RunWith(AndroidJUnit4.class)
public class HandlerTest {
private CountDownLatch countDownLatch;
@Test
@UiThreadTest
public void handlerTest() {
final Handler handler = new Handler();
countDownLatch = new CountDownLatch(1);
final Runnable r = new Runnable() {
@Override
public void run() {
// this code gets not executed
countDownLatch.countDown();
}
};
handler.postDelayed(r, 1000);
try {
final boolean finishedWithoutTimeout
= countDownLatch.await(5, TimeUnit.SECONDS);
Assert.assertTrue(finishedWithoutTimeout);
} catch (final InterruptedException e) {
e.printStackTrace();
}
}
}
处理程序不执行可运行代码。这也是我的生产代码的问题。
我用注释Looper.prepare()
修复了一个问题。@UiThreadTest
对我的处理程序问题有什么建议吗?
解决方案
原因是你把你的锁在thread
这里:
final boolean finishedWithoutTimeout = countDownLatch.await(5, TimeUnit.SECONDS);
并且当thread
被锁定时,您无法rannable
使用handler
. 刚刚被Thread
锁定。您可以通过将您的链接handler
到另一个来解决它thread
。这是一个简单的解决方案handlerThread
:
@Test
@UiThreadTest
public void handlerTest() {
countDownLatch = new CountDownLatch(1);
final HandlerThread handlerThread = new HandlerThread("solution!");
handlerThread.start();
final Runnable r = new Runnable() {
@Override
public void run() {
countDownLatch.countDown();
}
};
Handler handler = new Handler(handlerThread.getLooper());
handler.postDelayed(r, 1000);
try {
final boolean finishedWithoutTimeout = countDownLatch.await(5, TimeUnit.SECONDS);
Assert.assertTrue(finishedWithoutTimeout);
} catch (final InterruptedException e) {
e.printStackTrace();
}
}
推荐阅读
- javascript - 异步解决的时间比预期的要早
- javascript - 下拉列表中的多个操作
- python - 如何使用'if char.name in list_of_chars:'扫描list_of_chars中对象的变量名?
- python - 为什么 Celery 在启动 worker 的两种方式上有不同的行为?
- google-chrome - 503. 这是一个错误。有一个错误。请稍后再试。我们知道的就这些
- javascript - 应用程序在 aws-appsync 和 react-native 发生突变时崩溃
- html - 有没有办法让我的导航栏保持在右侧并在滚动时始终在页面顶部可见?
- javascript - 如何检测碰撞?
- javascript - 如何渲染一个
从 react-route-dom 使用对象而不是组件/函数 - ruby-on-rails - 在 Ruby 中使用 Amazon transcribe 流式转录