小编Eri*_*wne的帖子

单位测试Kotlin协程延迟

我正在尝试对使用的Kotlin协程进行单元测试delay().对于单元测试我不关心delay(),它只是减慢测试速度.我想以某种方式运行测试,这种方式在delay()调用时实际上并没有延迟.

我尝试使用委托给CommonPool的自定义上下文来运行协同程序:

class TestUiContext : CoroutineDispatcher(), Delay {
    suspend override fun delay(time: Long, unit: TimeUnit) {
        // I'd like it to call this
    }

    override fun scheduleResumeAfterDelay(time: Long, unit: TimeUnit, continuation: CancellableContinuation<Unit>) {
        // but instead it calls this
    }

    override fun dispatch(context: CoroutineContext, block: Runnable) {
        CommonPool.dispatch(context, block)
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望我可以从我的上下文delay()方法返回,但是它调用我的scheduleResumeAfterDelay()方法,我不知道如何将它委托给默认的调度程序.

unit-testing kotlin kotlinx.coroutines

27
推荐指数
4
解决办法
2815
查看次数

在HttpURLConnection中停止静默重试

我使用HttpURLConnectionAndroid的奇巧一些POST数据到服务器.服务器需要很长时间才能响应,并且连接在超时前静默重试1到3次.我不希望它重试,因为服务器处理所有请求,导致Bad Things(TM).

System.setProperty("http.keepAlive", "false")在打开连接之前尝试过,但这没有用.

android httpurlconnection

10
推荐指数
1
解决办法
4242
查看次数

对 APK 和应用程序包使用单独的签名密钥

我需要构建一个使用我们的应用程序签名密钥签名的 APK 进行内部测试,并构建一个使用我们的上传密钥签名的应用程序包,以便在提交到 Google Play 时使用。如何build.gradle根据我构建的是 APK 还是应用程序包来配置使用不同的密钥?

android gradle

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

在JNI后台线程中查找类时出现ClassNotFoundException

当我尝试在我的C++代码中的后台线程上创建一个ArrayList时,我的Android应用程序给了我一个ClassNotFoundException.

在JNI_OnLoad()中,我将我的类加载器放在一边:

jclass clsMine = env->FindClass("com/mypackage/MyClass");
jclass classClass = env->GetObjectClass(clsMine);
jclass classLoaderClass = env->FindClass("java/lang/ClassLoader");
jmethodID getClassLoaderMethod = env->GetMethodID(classClass, "getClassLoader", "()Ljava/lang/ClassLoader;");
gClassLoader = env->NewGlobalRef(env->CallObjectMethod(clsMine, getClassLoaderMethod));
gFindClassMethod = env->GetMethodID(classLoaderClass, "findClass", "(Ljava/lang/String;)Ljava/lang/Class;");
Run Code Online (Sandbox Code Playgroud)

我有一个findClass()方法,我可以从其他线程调用:

static jclass findClass(JNIEnv* env, const char* name)
{
    return static_cast<jclass>(env->CallObjectMethod(gClassLoader, gFindClassMethod, env->NewStringUTF(name)));
}
Run Code Online (Sandbox Code Playgroud)

我可以使用它来访问MyClass及其内部类和接口.但是当我尝试创建一个ArrayList时,我的findClass()会抛出一个ClassNotFoundException.

我意识到,如果我的Java代码在加载本机库之前创建了一个ArrayList,那么我就不会得到异常.或者如果我env->FindClass("java/util/ArrayList")在JNI_OnLoad()中,那么我没有得到异常.但这些都是解决方法.为什么我不能使用我隐藏的类加载器创建Java类?或者我应该使用不同的类加载器?

编辑:

并且为了增加皱纹,在ART下,我env->FindClass("java/util/ArrayList")在JNI_OnLoad()中调用的解决方法不起作用.

java-native-interface android classloader

5
推荐指数
0
解决办法
1466
查看次数

使用Dagger注入具有不同接口的同一对象

假设我有一个由Dagger 2创建的单例,该单例实现了接口FooBar。代码中有使用的Foo地方,还有其他使用的地方Bar,但是无论注入哪个接口,我都希望使用相同的单例。这可能吗?

dagger-2

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

Java/Kotlin 泛型列表与通配符不兼容的类型

我有一个抽象 Java 类,它有一个调用子类中方法的具体方法:

abstract class JavaSuperclass<T> {
    T doSomething() {
        ...
        return doSomethingInSubclass();
    }

    abstract T doSomethingInSubclass();
}
Run Code Online (Sandbox Code Playgroud)

我有一个 Java 子类,其泛型类型设置为列表:

class JavaSubclass extends JavaSuperclass<List<WhateverJava>> {
    List<WhateverJava> doSomethingInSubclass() {...}
}
Run Code Online (Sandbox Code Playgroud)

我有一个 Kotlin 子类:

class KotlinSubclass : JavaSuperclass<List<WhateverKotlin>> {
    override fun doSomethingInSubclass(): List<WhateverKotlin> {...}
}
Run Code Online (Sandbox Code Playgroud)

WhateverJava是 Java 类,WhateverKotlin是 Kotlin 数据类。)

然后在 Java 类中我使用这两个子类。

List<WhateverJava> listFromJava = javaSubclass.doSomething();
List<WhateverKotlin> listFromKotlin = kotlinSubclass.doSomething();
Run Code Online (Sandbox Code Playgroud)

调用 Java 子类的行可以正常编译,但调用 Kotlin 子类的行会出现以下错误:

error: incompatible types: List<capture<? extends WhateverKotlin>> cannot be converted to List<WhateverKotlin>
Run Code Online (Sandbox Code Playgroud)

java generics kotlin

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