gpt4 book ai didi

android - ActivityUnitTestCase 和 Activity#runOnUiThread

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:06:12 24 4
gpt4 key购买 nike

我的测试侧重于 AsyncTask 完成并验证后续 Activity 是否已启动。

众所周知,除非从 UI 线程实例化并执行 AsyncTask,否则不会调用 AsyncTask#onPostExecute,因此我调用 AsyncTask 的(测试可见)方法通过必要的预防措施来确保此行为——通过 Runnable如果在 UI 线程上立即运行或计划在 UI 线程上运行。

当从 ActivityUnitTestCase 测试调用此方法时,通过 Activity#runOnUiThread 实例化并执行此 AsyncTask 的 Runnable 最终在 UI 线程以外的线程上运行。 有没有办法确保此 Runnable 将在 Activity 中的 UI 线程上执行?

附录:

  • 测试在 ActivityInstrumentationTestCase2 下按预期运行类,但我无权访问ActivityUnitTestCase#getStartedActivityIntent。我知道Instrumentation.ActivityMonitor,它不是解决方案。
  • 安排在 ActivityUnitTestCase#runTestOnUiThread 上的 Runnables do 在 UI 上运行线程。
  • 我不想重新定义我的测试。
  • 奇怪的是,ActivityUnitTestCase#startActivity 不在 UI 线程上调用 Activity#onCreate。

编辑:这里有一些(未经测试的)代码演示了问题的本质:

// ExampleActivityTests.java

class ExampleActivityTests : public ActivityUnitTestCase <ExampleActivity> {

public void testThatRequiresUiThread() {

startActivity (new Intent(), null, null);
// ...call instrumentation onStart, onResume...

runTestOnUiThread(new Runnable() {
public void run() {
boolean isUiThread = Thread.currentThread() == Looper.getMainLooper().getThread();
Log.d ("A", "Running on UI Thread? " + isUiThread);
}
});

getActivity().methodRequiringUiThread();

// assertions here...
}
}

// ExampleActivity.java -- just the relevant method

public void methodRequiringUiThread() {

runOnUiThread(new Runnable() {
public void run() {
boolean isUiThread = Thread.currentThread() == Looper.getMainLooper().getThread();
Log.d ("B", "Running on UI Thread? " + isUiThread);
}
});
}

在 LogCat 中我们将看到:

A | Running on UI Thread? true
B | Running on UI Thread? false

最佳答案

在 UI 线程上调用 ActivityUnitTestCase#startActivity 解决了我的问题。

public void testThatRequiresUiThread() {

runTestOnUiThread(new Runnable() {

@Override
public void run() {
startActivity(new Intent(), null, null);
}
});

// ...
getActivity().methodRequiringUiThread();

// rest of test...
}

产量

A | Running on UI Thread? true
B | Running on UI Thread? true

关于android - ActivityUnitTestCase 和 Activity#runOnUiThread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9694282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com