小编Mic*_*ovo的帖子

Gradle 3.0"编译"到"实现"迁移不适用于fileTree

我想删除我所有的皮棉警告,但我坚持用了一个compileimplementation迁移.

如果我改变了这个:

    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,但它没有帮助.

android android-gradle-plugin

13
推荐指数
1
解决办法
6242
查看次数

Espresso测试单独通过,在套件中运行时失败

我有以下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://code.google.com/p/android/issues/detail?id=235247

android android-espresso

9
推荐指数
1
解决办法
3077
查看次数

Espresso不会等到活动被破坏,然后在为下一次测试创建一个新活动之前

情况

在这里的官方文档中:https://google.github.io/android-testing-support-library/docs/rules/index.html,它说:

"此规则提供单个活动的功能测试.在使用@Test注释的每个测试之前以及使用@Before注释的任何方法之前,将启动测试中的活动.它将在测试完成后终止,并且所有方法都使用@After注释完成后,测试下的活动可在测试期间通过调用ActivityTestRule#getActivity()访问".

技术上是的,活动正在终止.但似乎没有任何保证何时会发生这种情况.例如,它不一定会在为下一次测试再次创建之前发生.


问题

在我的一些测试中,在下一次测试开始之前,我需要依赖每个测试后调用的片段OnDestroy或OnDetach .我有需要清除和重新创建的监听器.

如果在当前测试中在OnResume之后调用上一个测试中的onDestroy,则清除回调并且视图不会更新并且测试失败.

如果根本没有调用上一次测试的onDestroy,那么当前测试的回调将引用错误的实例.同样,视图将不会更新,测试将失败.


问题

  1. 这种行为是在设计中讨论的还是一个bug?到目前为止,我无法在文档中找到它.
  2. 处理这个问题的最佳做法是什么?我怀疑其他人都遇到过这个问题.

编辑:我现在已经解决了第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)

android android-espresso

9
推荐指数
1
解决办法
2426
查看次数

协程单元测试单独通过,但一起运行时不通过

我有两个协程测试,它们在单独运行时都通过,但是如果我一起运行它们,第二个总是失败(即使我切换它们!)。我得到的错误是:

想要但未调用: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)

android kotlin-coroutines

7
推荐指数
1
解决办法
1607
查看次数

如何正确编写 Swift UI Toggle 的 UI 测试

有谁知道如何正确编写 Toggle 的 UI 测试?即使在一个全新的项目中,整个 UI 中只有一个切换而没有其他内容,我仍然会收到此类错误:

\n
Failed 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\n
Run Code Online (Sandbox Code Playgroud)\n

用户界面如下所示:

\n
struct ContentView: View {\n  @State private var toggleValue = true\n  var body: some View {\n    Toggle("Test switch", isOn: $toggleValue)\n      .padding()\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

测试看起来像这样(这两行中的任何一行都会给我同样的错误):

\n
     func testExample() throws {\n        let app = XCUIApplication()\n …
Run Code Online (Sandbox Code Playgroud)

ios xctest swiftui

7
推荐指数
1
解决办法
1994
查看次数

如何在 Android Studio 项目中查找哪些文件正在使用特定的外部库

问题

在 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:接受的答案确实有效,但我需要重定向控制台输出。

android intellij-idea android-gradle-plugin

6
推荐指数
1
解决办法
5094
查看次数

从kotlin引用时,Java文件的未解析引用具有不同的风格

问题:

这个问题很可能已经从所有其他类似的问题中得到了回答,但我似乎无法让它发挥作用.

  • 如果我从主源集中的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)

建立:

  • Kotlin版本:1.2.21
  • Gradle版本:3.0.1
  • 插件:
    • apply plugin:'kotlin-android'
    • 申请插件:'kotlin-kapt' …

java android kotlin android-gradle-plugin

6
推荐指数
1
解决办法
741
查看次数

尽管 RememberUpdatedState 尚未更改,但 LaunchedEffect 在配置更改时执行

如果我正确理解文档,如果 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)

编辑:

澄清一下,目标是允许用户在文本字段中输入文本,并且不会在旋转时清除该文本。这对于用户来说会非常烦人,而且可能不是他们所期望的。

android-jetpack-compose

6
推荐指数
1
解决办法
2223
查看次数

Java/IntelliJ无法识别Dagger2组件的"Dagger"关键字

我可能在这里遗漏了一些非常基本的东西,所以希望这不是一个难题.

我相当于

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关键字无法识别.我错过了什么?

任何帮助或方向赞赏.对于像我这样的初学者,我没有找到那么棒的文档.

java intellij-idea dagger-2

5
推荐指数
1
解决办法
1297
查看次数

小部件服务在尝试填充集合之前不会等待数据

好吧,看来我又被卡住了。我的小部件有一半在工作,我我知道它为什么会失败,但我不知道如何修复它。

在我的小部件服务类的 onDataSetChanged() 方法中,我调用以获取我的数据(异步)。但是系统会在数据加载之前调用 getCount(),因此大小返回 0,并且从不调用 getViewAt()。

如果我在 onDataSetChanged() 中创建一些假数据而不是调用以从 Firebase 获取真实数据,那么它会显示得很好。所以我知道它的工作原理除此之外。

我已经尝试了各种方法来让它工作,但没有运气。我不想把它变成一个很长的问题,所以我会尽量保持简单。我的问题是系统如何知道数据何时准备好?似乎没有我可以调用的方法来通知它数据现在已经存在。

我可能完全错了,但我认为这就是问题所在。onDataSetChanged() 方法不会等待,我无法告诉它。

更令人困惑的是,在我使用假静态数据的应用程序的 mockDebug 版本中,即使使用异步调用,它也确实有效。我的结论是它的加载速度必须如此之快,以至于在调用 getCount() 时它已准备就绪。但更令人困惑的是,有一段时间它也在 prodDebug 版本中工作,然后没有,也没有。据我所知,在那段时间我没有改变任何东西。无论如何,这是我能想出的唯一解释。原因是因为我可以在调试器或日志记录中看到,当我从 Firebase 获取数据时,在加载数据之前调用了 getCount(),导致它失败,但如果我使用静态数据,它会在加载数据后调用,让它成功。

我如何让它等待?或者我可能做错了什么?

谢谢。

android android-widget firebase-realtime-database

5
推荐指数
1
解决办法
410
查看次数