小编Ogn*_*yan的帖子

如何配置gradle使用logback-classic仅适用于Android中的单元测试?

我有一个Android应用程序thich使用slf4j + logback.Gradle文件如下所示:

...
compile('com.github.tony19:logback-android-core:1.1.1-6') {
    exclude group: 'ch.qos.logback.core.net'
}

compile('com.github.tony19:logback-android-classic:1.1.1-6') {
    exclude group: 'ch.qos.logback.core.net'
}

compile 'org.slf4j:slf4j-api:1.7.25'
Run Code Online (Sandbox Code Playgroud)

我在assets /中有logback.xml.当我按预期运行应用程序日志记录工作时.最近我决定添加新的单元测试(常规,而不是android单元测试),但我看到日志消息没有显示.

我在gragle文件中添加了以下内容:

testCompile('ch.qos.logback:logback-classic:1.2.3') {
    exclude group: 'com.github.tony19'
}
Run Code Online (Sandbox Code Playgroud)

现在显示日志消息,但在单元测试的每次运行中,我收到此警告:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/o/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.2.3/7c4f3c474fb2c041d8028740440937705ebb473a/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/o/.gradle/caches/modules-2/files-2.1/com.github.tony19/logback-android-classic/1.1.1-6/614c66c9ece69eef48c65a8558de4fd7266d9f69/logback-android-classic-1.1.1-6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
Run Code Online (Sandbox Code Playgroud)

有没有办法专门指定哪个slf4j绑定用于常规应用程序运行,哪些仅用于单元测试(或任何其他解决方案)?

依赖关系图:

compile - Classpath for compiling the main sources.
+--- com.bolyartech.forge.android:forge-android:7.1.0
|    +--- com.bolyartech.forge:base:5.1.0
|    |    +--- org.slf4j:slf4j-api:1.7.7 -> 1.7.25
|    |    +--- com.darwinsys:hirondelle-date4j:1.5.1
|    |    +--- com.google.guava:guava:20.0 …
Run Code Online (Sandbox Code Playgroud)

android unit-testing logback slf4j gradle

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

使用Spark Java微框架时如何设置嵌入式Jetty服务器的会话超时?

基本上标题是什么.我知道如何使用web.xml设置它,但是当我在Spark Java中使用jetty作为嵌入式服务器时,我找不到设置会话超时的方法.我正在寻找一个全局设置,而不是request.session().maxInactiveInterval(int)每个会话设置它.

java servlets

6
推荐指数
0
解决办法
752
查看次数

如何使用 OkHttp 中止大文件上传?

我正在使用 OkHttp 3.1.2。我创建了类似于原始配方的文件上传,可以在这里找到: https: //github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/PostMultipart.java

我找不到如何根据用户请求中止大文件上传的示例。我的意思不是如何获取用户请求,而是如何告诉 OkHttp 停止发送数据。到目前为止,我能想到的唯一解决方案是使用 custom RequestBody,添加一个abort()方法并重写该writeTo()方法,如下所示:

public void abort() {
    aborted = true;
}

@Override
public void writeTo(BufferedSink sink) throws IOException {
    Source source = null;
    try {
        source = Okio.source(mFile);
        long transferred = 0;
        long read;

        while (!aborted && (read = source.read(sink.buffer(), SEGMENT_SIZE)) != -1) {
            transferred += read;
            sink.flush();
            mListener.transferredSoFar(transferred);

        }
    } finally {
        Util.closeQuietly(source);
    }
}
Run Code Online (Sandbox Code Playgroud)

还有其他办法吗?

java okhttp

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

非阻塞文件缓存(BitmapLruCache)实现?

我正在尝试为Android Volley Framework的ImageLoader功能创建一个简单的演示.构造函数如下:

public ImageLoader(RequestQueue queue, ImageCache imageCache)
Run Code Online (Sandbox Code Playgroud)

问题在于ImageCache.它的JavaDoc声明:

简单缓存适配器接口.如果提供给ImageLoader,它将在发送给Volley之前用作L1缓存.实现不得阻止.建议使用LruCache实现.

  1. 在这种情况下,"实施必须阻止"究竟是什么意思?
  2. 是否有一个非阻塞文件缓存的例子(甚至非android但是"纯"java),我可以用它来教育我自己如何将我现有的文件缓存转换为非阻塞?
  3. 如果不存在 - 使用我现有的实现(仅从文件中读取)可能会产生负面影响:

    public byte [] get(String filename){

    byte[] ret = null;
    
    if (filesCache.containsKey(filename)) {
        FileInfo fi = filesCache.get(filename);
        BufferedInputStream input;
    
        String path = cacheDir + "/" + fi.getStorageFilename();
        try {
            File file = new File(path);
            if (file.exists()) {
                input = new BufferedInputStream(new FileInputStream(file));
                ret = IOUtils.toByteArray(input);
                input.close();
            } else {
                KhandroidLog.e("Cannot find file " + path);
            }
        } catch (FileNotFoundException e) …
    Run Code Online (Sandbox Code Playgroud)

java android android-volley

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

使用HttpClient 4.x而不是内置pre-beta

有没有办法在我的android项目更新版本中使用HttpClient?

我试图在构建路径更新的HttpClientjar中导入+ set ,我的应用程序在Eclipse中编译没有错误但是当我在模拟器或真实设备中运行它时会产生强制关闭,因为很明显在运行时应用程序引用了内置库不是4.1.1 ......我已经在某处看过有一种方法可以在建造时使用"重新包装",Maven但我不知道从哪里开始.我将非常感谢任何可能导致我使用4.1.1而不是内置版本的指示.

给出一些上下文:我试图移植到Android现有的遗留代码,这取决于4.1的功能,即我试图避免重大改写我的旧代码.

android httpclient

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

如何将完成= false的模块中的缺失注入从Dagger 1迁移到Dagger 2

我有一个图书馆项目/模块,Android应用程序和常规Java应用程序都使用它.在Dagger 1中,该项目/模块具有财产complete = false.在@Inject字段中,任何类实现或@Provides方法都不满足.我们的想法是强制complete = true必须提供系统特定实现的"顶层"模块

仅仅是为了举例:在图书馆项目中我有ActLogin活动,有字段@Inject @Named("app version") mAppVersion.登录服务器时使用此字段的值.ActLogin被几个使用此库的应用程序使用.每个应用程序的模块都具有complete = true并提供了价值@Provides @Named("app version") provideAppVersion()

迁移Dagger 2的文档(http://google.github.io/dagger/dagger-1-migration.html)指出:

Dagger 2模块都声明为complete = false和library = true

同时,"主要"文档页面(http://google.github.io/dagger/)指出:

Dagger注释处理器是严格的,如果任何绑定无效或不完整,将导致编译器错误.

后者显然是正确的,因为当试图建立不满意的注入错误时会产生(error: java.lang.String cannot be provided without an @Provides- or @Produces-annotated method).

问题是:是否有可能将这种方法(推迟提供注入)迁移到Dagger 2以及如何?

PS最初我认为这是一个肮脏的解决方法,在库的@Module中提供一些虚拟值,但是又一次 - 你不能在Dagger 2中使用模块覆盖(这是一种WTF(!!!).模块覆盖是最有用的功能我在创建单元测试时).可能我错过了一些非常基本的东西,我希望有人可以指出:-).

android dependency-injection dagger dagger-2

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

如何定制setter并检查参数的有效性?

我是Kotlin的新手,我无法解决一个非常基本的问题:

我想要一个自定义setter并检查参数值是否有效(如果没有则抛出异常).

我的代码:

class Test {
    var presni: Int = 1
        set(value) {
            if (value < 0) {
                throw IllegalArgumentException("Negative value");
            }

            presni = value
        }
}
Run Code Online (Sandbox Code Playgroud)

但它给了我警告presni = value线:递归属性访问器

Kotlin中用于检查setter中参数的有效性的成语是什么?

kotlin

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

为什么Kotlin坚持要对`ret`变量进行初始化?

我有以下功能:

override fun countForTicket(dbc: SQLiteDatabase, ticketId: Long): Int {
    var ret: Int

    dbc.query(
        TABLE_SECOND_CHANCE_PRIZES, arrayOf("count(id)"),
        "ticket = ?", arrayOf(ticketId.toString()),
        null, null, null
    ).use { c ->
        ret = if (c.moveToFirst()) {
            c.getInt(0)
        } else {
            0
        }
    }


    return ret
}
Run Code Online (Sandbox Code Playgroud)

问题是行return ret ret内用红色下划线,并且在尝试编译时给我错误:

变量“ ret”必须初始化

从我的角度来看,似乎ret总是被初始化。我想念什么?是因为初始化是在lambda中进行的,并且编译器不能保证变量已初始化?

kotlin

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