我想删除我所有的皮棉警告,但我坚持用了一个compile来implementation迁移.
如果我改变了这个:
compile fileTree(include: ['*.jar'], dir: 'libs')
Run Code Online (Sandbox Code Playgroud)
对此:
implementation fileTree(include: ['*.jar'], dir: 'libs')
Run Code Online (Sandbox Code Playgroud)
那么应用程序将无法构建,我收到以下错误:
错误:无法解析以下类的超类型.请确保您在类路径中具有所需的依赖项:...未解析的超类型:veg.mediaplayer.sdk.MediaPlayer.MediaPlayerCallback
这是一个错误还是我应该为fileTree做些不同的事情?我找不到任何解释文档:https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html.
我已将所有gradle文件中的所有其他行更改为compile,implementation并且它们都可以正常工作.
编辑:我还应该注意,这个特定的模块在lib文件夹中有一个jar.对于没有罐子的模块,它可以工作.
编辑2:我注意到,如果有一个罐子,实际上并不总是会发生.我有另一个模块与jar(我创建),它工作正常.mediaplayersdk.jar肯定有问题.
鉴于它只是抱怨从jar中的文件实现的回调,我想这是它被卡住的地方.
我也试过Android Studio 3.1.0-beta1和gradle 4.4,但它没有帮助.
我有以下Espresso测试.如果我自己运行它总是通过,但是当我一起运行类中的所有测试时总是失败.
有点奇怪的是,它曾经作为套件的一部分工作.我不知道为什么它现在停止工作了.它一定是我做过的,但我不知道是什么.
@Test
public void itemHasImage_ShowsImage() {
closeSoftKeyboard();
if (mItem.getImageUrl() != null) {
onView(withId(R.id.edit_item_image)).perform(scrollTo())
.check(matches(isDisplayed()));
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Error performing 'scroll to'...
...
Caused by: java.lang.RuntimeException: Action will not be performed
because the target view does not match one or more of the following
constraints:(view has effective visibility=VISIBLE and is descendant
of a: (is assignable from class: class android.widget.ScrollView...
Run Code Online (Sandbox Code Playgroud)
视图是可见的,是滚动视图的后代,正如它在自己运行时传递所证明的那样.
当它进入这个测试(在套件中)它只是不滚动.但是当我单独运行它时它滚动得很好.
在另一个堆栈溢出问题中,我问最近Espresso没有在参数化测试中第二次迭代启动Activity相同,我发现上一次测试中的onDestroy在当前测试中的onResume之后被调用,导致它将值设置为null并失败考试.在这种情况下,问题是测试本身通过但不在套件中.我现在有类似的问题,但没有明显的方法来解决它.(编辑:无法再应用其他问题的解决方法).
任何人的想法?它能以某种方式阅读错误的活动吗?也许它正在看着之前测试中的那个.这听起来很荒谬,但在最后一个问题之后我觉得有可能.
编辑:好的,事实证明,当作为套件的一部分运行此测试时,图像实际上是不可见的,导致测试失败.我发现这是使用调试器并手动滚动视图.但为什么?
我认为这是一个错误,并在此处记录了一个问题:
在这里的官方文档中:https://google.github.io/android-testing-support-library/docs/rules/index.html,它说:
"此规则提供单个活动的功能测试.在使用@Test注释的每个测试之前以及使用@Before注释的任何方法之前,将启动测试中的活动.它将在测试完成后终止,并且所有方法都使用@After注释完成后,测试下的活动可在测试期间通过调用ActivityTestRule#getActivity()访问".
技术上是的,活动正在终止.但似乎没有任何保证何时会发生这种情况.例如,它不一定会在为下一次测试再次创建之前发生.
在我的一些测试中,在下一次测试开始之前,我需要依赖每个测试后调用的片段OnDestroy或OnDetach .我有需要清除和重新创建的监听器.
如果在当前测试中在OnResume之后调用上一个测试中的onDestroy,则清除回调并且视图不会更新并且测试失败.
如果根本没有调用上一次测试的onDestroy,那么当前测试的回调将引用错误的实例.同样,视图将不会更新,测试将失败.
编辑:我现在已经解决了第2部分.请参阅下面的解决方法部分.但是,如果有人可以通过引用官方资源来回答第一部分,那么我很乐意接受这个答案.这就是我在这里真正要求的.第二部分只是一个奖励,如果有人有一些想法.
如果你想看到这种行为,它只需要一些时间.使用如下所示的Activity创建一个新项目:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
Run Code Online (Sandbox Code Playgroud)
和这样的测试类:
@RunWith(AndroidJUnit4.class)
@LargeTest
public class EspressoLifecycleTest {
@Rule
public ActivityTestRule<MainActivity> mActivityRule =
new ActivityTestRule<>(MainActivity.class);
@Test
public void test1() {
}
@Test
public void …Run Code Online (Sandbox Code Playgroud) 我有两个协程测试,它们在单独运行时都通过,但是如果我一起运行它们,第二个总是失败(即使我切换它们!)。我得到的错误是:
想要但未调用:observer.onChanged([SomeObject(someValue=test2)]); 实际上,与此模拟的交互为零。
关于协程(或一般测试)和做错事,我可能不了解一些基本的东西。
如果我调试测试,我发现失败的测试不是在等待内部runBlocking完成。实际上,我首先拥有内部的原因runBlocking是为了解决这个确切的问题,它似乎适用于个人测试。
关于为什么会发生这种情况的任何想法?
@ExperimentalCoroutinesApi
@RunWith(MockitoJUnitRunner::class)
class ViewModelTest {
@get:Rule
val instantTaskExecutorRule = InstantTaskExecutorRule()
private lateinit var mainThreadSurrogate: ExecutorCoroutineDispatcher
@Mock
lateinit var repository: DataSource
@Mock
lateinit var observer: Observer<List<SomeObject>>
private lateinit var viewModel: SomeViewModel
@Before
fun setUp() {
mainThreadSurrogate = newSingleThreadContext("UI thread")
Dispatchers.setMain(mainThreadSurrogate)
viewModel = SomeViewModel(repository)
}
@After
fun tearDown() {
Dispatchers.resetMain()
mainThreadSurrogate.close()
}
@Test
fun `loadObjects1 should get objects1`() = runBlocking {
viewModel.someObjects1.observeForever(observer)
val expectedResult = listOf(SomeObject("test1"))
`when`(repository.getSomeObjects1Async())
.thenReturn(expectedResult)
runBlocking {
viewModel.loadSomeobjects1() …Run Code Online (Sandbox Code Playgroud) 有谁知道如何正确编写 Toggle 的 UI 测试?即使在一个全新的项目中,整个 UI 中只有一个切换而没有其他内容,我仍然会收到此类错误:
\nFailed to get matching snapshot: Multiple matching elements found for <XCUIElementQuery: 0x60000108c410>.\nSparse tree of matches:\n\xe2\x86\x92Application, pid: 26580, label: 'TestToggle'\n \xe2\x86\xb3Window (Main)\n \xe2\x86\xb3Other\n \xe2\x86\xb3Other\n \xe2\x86\xb3Other\n \xe2\x86\xb3Other\n \xe2\x86\xb3Switch, label: 'Test switch', value: 1\n \xe2\x86\xb3Switch, label: 'Test switch', value: 1\nRun Code Online (Sandbox Code Playgroud)\n用户界面如下所示:
\nstruct ContentView: View {\n @State private var toggleValue = true\n var body: some View {\n Toggle("Test switch", isOn: $toggleValue)\n .padding()\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n测试看起来像这样(这两行中的任何一行都会给我同样的错误):
\n func testExample() throws {\n let app = XCUIApplication()\n …Run Code Online (Sandbox Code Playgroud) 在 Android Studio 项目的项目视图中的“外部库”下,我有这些库“stax-stax-api:1.0.1@jar”和“xpp3:xpp3:1.1.3.3@jar”。他们给我带来了问题,以至于我无法构建项目。我似乎无法弄清楚它们是如何到达那里的,或者它们被在哪里使用。
我现在构建时收到的错误消息是:
"错误:错误:xpp3 定义的类与 Android 现在提供的类冲突。解决方案包括寻找更新版本或没有相同问题的替代库(例如,对于 httpclient 使用 HttpUrlConnection 或 okhttp),或重新打包库使用类似 jarjar 的东西。[DuplicatePlatformClasses] ”
错误消息很好,只是它没有告诉我首先是谁在使用这个库。
有没有一种简单的方法可以找出它们在项目中的使用位置?或者甚至是一种简单但不需要查看每个文件的方法?这是一个包含大量文件的多模块项目。如果我可以删除它们,这会告诉我,但没有删除选项。
这可能是我忽略的非常简单的事情。任何帮助表示赞赏。很高兴根据要求添加更多信息。
我试过“分析依赖关系”,但它没有显示我可以看到的任何引用。
更新:我忘了提到我也尝试过,./gradlew app:dependencies但它只告诉我我的项目依赖于这些库。我已经知道了。有没有办法获得一些更具体的信息,以便我可以删除库?
更新 2:接受的答案确实有效,但我需要重定向控制台输出。
这个问题很可能已经从所有其他类似的问题中得到了回答,但我似乎无法让它发挥作用.
如果我从主源集中的java文件引用另一种风格(不同的源集)中的特定java文件,它就可以工作.
如果我尝试从主源集中的Kotlin文件引用同一个文件,则会抱怨它无法看到它("未解析的引用").
如果我将相同的文件移动到主源设置它是有效的(所以它不是文件本身).
如果我将Java文件转换为Kotlin它可以工作(这是我目前的解决方案),但我想知道它为什么不起作用,因为转换并不总是那么容易,它应该可以在没有转换的情况下工作.
根据我的谷歌搜索它似乎与Gradle中的源集相关,但我不想在Java文件夹旁边有一个单独的Kotlin文件夹,所以我不确定我是否需要这个.另外,我同时拥有Java和Kotlin的另一个项目没有配置并且工作正常.
我正在使用带有flavorDimensions的productFlavors,并且有一个名为"dimension1Dimension2"的源集(这是我试图引用的Java文件所在的位置).
看下面的设置,我可能做错了什么或丢失了什么?这个项目主要是Java,所以我刚刚开始添加Kotlin.我看不出与我的其他项目有什么不同,主要是Kotlin和一些Java.
另一件奇怪的事情是它适用于三种口味中的一种.维度1有两种类型,维度2有三种类型.只有其中一个维度类型有效.
也许代码更清晰:
flavorDimensions "product", "mode"
productFlavors {
mock { // only this one works (e.g. <company_name>Mock is the source set)
applicationIdSuffix = ".mock"
dimension "mode"
}
dev {
applicationIdSuffix = ".dev"
dimension "mode"
}
prod {
dimension "mode"
}
demo {
applicationIdSuffix = ".demo"
dimension "product"
buildConfigField "String", "UPDATE_DIRECTORY", "\"/release/\""
buildConfigField "boolean", "SHOW_STREAM_STATUS", "false"
}
<company_name> {
applicationIdSuffix = ".<company_name>"
dimension "product"
}
}
Run Code Online (Sandbox Code Playgroud)
如果我正确理解文档,如果 RememberUpdatedState 未更改,则 LaunchedEffect 不应再次运行。
如果我运行下面的代码,那么它不会按预期工作,并且该值会在轮换时再次更新。
如果没有 LaunchedEffect,则在配置更改时会记住 RememberSaveable,并且输入中的文本是正确的(如果我输入某些内容,它仍然存在)。这让我相信 RememberUpdatedState 也不应该改变,但它却被触发了。为什么?
我做错了什么还是这是一个错误?或者有更好的方法来做到这一点吗?
谢谢 :)
@Composable
fun ThingView(
thingViewModel: ThingViewModel,
id: String?
) {
var thingName by rememberSaveable { mutableStateOf("") }
val scope = rememberCoroutineScope()
LaunchedEffect(rememberUpdatedState(newValue = thingName)) {
scope.launch {
id?.let {
val thing = thingViewModel.getThing(id)
thingName = thing.name
}
}
}
OutlinedTextField(
value = thingName,
onValueChange = { thingName = it },
label = { Text("Name") }
)
}
Run Code Online (Sandbox Code Playgroud)
编辑:
澄清一下,目标是允许用户在文本字段中输入文本,并且不会在旋转时清除该文本。这对于用户来说会非常烦人,而且可能不是他们所期望的。
我可能在这里遗漏了一些非常基本的东西,所以希望这不是一个难题.
我相当于
CoffeeShop coffeeShop = DaggerCoffeeShop.create();
Run Code Online (Sandbox Code Playgroud)
IDE(IntelliJ)无法识别.这是一个本机Java项目." Dagger CoffeShop"部分全是红色.
该组件使用以下语法:
@Component(modules = <ModuleClassName>.class)
public interface CoffeeShop {
// some methods.
// does it matter what goes in here for it to recognise the component?
}
Run Code Online (Sandbox Code Playgroud)
"ModuleClassName"是使用@Module注释的模块的名称,包括@Provides方法.
为了获得libs我在Gradle中使用它:
compile 'com.google.dagger:dagger:2.4'
compile 'com.google.dagger:dagger-compiler:2.4'
Run Code Online (Sandbox Code Playgroud)
这就是我需要的吗?对于任何注释我都没有任何错误,只是这个Dagger关键字无法识别.我错过了什么?
任何帮助或方向赞赏.对于像我这样的初学者,我没有找到那么棒的文档.
好吧,看来我又被卡住了。我的小部件有一半在工作,我想我知道它为什么会失败,但我不知道如何修复它。
在我的小部件服务类的 onDataSetChanged() 方法中,我调用以获取我的数据(异步)。但是系统会在数据加载之前调用 getCount(),因此大小返回 0,并且从不调用 getViewAt()。
如果我在 onDataSetChanged() 中创建一些假数据而不是调用以从 Firebase 获取真实数据,那么它会显示得很好。所以我知道它的工作原理除此之外。
我已经尝试了各种方法来让它工作,但没有运气。我不想把它变成一个很长的问题,所以我会尽量保持简单。我的问题是系统如何知道数据何时准备好?似乎没有我可以调用的方法来通知它数据现在已经存在。
我可能完全错了,但我认为这就是问题所在。onDataSetChanged() 方法不会等待,我无法告诉它。
更令人困惑的是,在我使用假静态数据的应用程序的 mockDebug 版本中,即使使用异步调用,它也确实有效。我的结论是它的加载速度必须如此之快,以至于在调用 getCount() 时它已准备就绪。但更令人困惑的是,有一段时间它也在 prodDebug 版本中工作,然后没有,也没有。据我所知,在那段时间我没有改变任何东西。无论如何,这是我能想出的唯一解释。原因是因为我可以在调试器或日志记录中看到,当我从 Firebase 获取数据时,在加载数据之前调用了 getCount(),导致它失败,但如果我使用静态数据,它会在加载数据后调用,让它成功。
我如何让它等待?或者我可能做错了什么?
谢谢。