我有一个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) 基本上标题是什么.我知道如何使用web.xml设置它,但是当我在Spark Java中使用jetty作为嵌入式服务器时,我找不到设置会话超时的方法.我正在寻找一个全局设置,而不是request.session().maxInactiveInterval(int)每个会话设置它.
我正在使用 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)
还有其他办法吗?
我正在尝试为Android Volley Framework的ImageLoader功能创建一个简单的演示.构造函数如下:
public ImageLoader(RequestQueue queue, ImageCache imageCache)
Run Code Online (Sandbox Code Playgroud)
问题在于ImageCache.它的JavaDoc声明:
简单缓存适配器接口.如果提供给ImageLoader,它将在发送给Volley之前用作L1缓存.实现不得阻止.建议使用LruCache实现.
如果不存在 - 使用我现有的实现(仅从文件中读取)可能会产生负面影响:
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)有没有办法在我的android项目更新版本中使用HttpClient?
我试图在构建路径更新的HttpClientjar中导入+ set ,我的应用程序在Eclipse中编译没有错误但是当我在模拟器或真实设备中运行它时会产生强制关闭,因为很明显在运行时应用程序引用了内置库不是4.1.1 ......我已经在某处看过有一种方法可以在建造时使用"重新包装",Maven但我不知道从哪里开始.我将非常感谢任何可能导致我使用4.1.1而不是内置版本的指示.
给出一些上下文:我试图移植到Android现有的遗留代码,这取决于4.1的功能,即我试图避免重大改写我的旧代码.
我有一个图书馆项目/模块,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(!!!).模块覆盖是最有用的功能我在创建单元测试时).可能我错过了一些非常基本的东西,我希望有人可以指出:-).
我是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中参数的有效性的成语是什么?
我有以下功能:
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中进行的,并且编译器不能保证变量已初始化?