Android最近推出了一个新的com.android.feature插件,用于将应用程序分解为新的Instant应用程序的功能.它似乎是他们一般推荐的架构,而不仅仅是您为即时应用程序分割的功能.你可以在这里阅读它的用法.
我无法理解的是这个插件实际上比普通android-library插件更好/不同.我问,因为我的团队合法地考虑将我们的代码拆分成功能模块,原因与Android即时应用程序无关,我不明白使用该com.android.feature插件的好处是什么.
我在Kotlin编写了一个Java库,我想把它编译成一个可供Java和Kotlin应用程序使用的jar.
我们的想法是jar应该能够处理Java项目和Kotlin项目.做一个简单的./gradlew clean assemble生成一个jar,当我检查jar时,我可以看到几个未包含在jar中的导入,普通的Java应用程序也无法访问它:
import jet.runtime.typeinfo.JetValueParameter;
import kotlin.jvm.internal.Intrinsics;
import kotlin.jvm.internal.KotlinClass;
import kotlin.jvm.internal.KotlinClass.Kind;
import kotlin.jvm.internal.KotlinSyntheticClass;
import kotlin.jvm.internal.KotlinSyntheticClass.Kind;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Run Code Online (Sandbox Code Playgroud)
我怎么能在jar中包含上面的依赖项?现在罐子只有30kb.我更喜欢不必包括整个Kotlin运行时,但只能在使用过的组件中进行编译.
所以这是交易:我正在使用ORMLite for Android,它使用注释来在Android中进行映射.如你所知,Android中的注释很慢,ORMLite的制造商已经意识到这一点,因此他们添加了运行java可执行文件以生成资源文件的能力,该资源文件绕过了在Android应用程序中运行时检查注释的需要.它看起来像这样:
public class DatabaseConfigUtil extends OrmLiteConfigUtil {
private static final Class<?>[] classes = new Class[] {
SimpleData.class,
};
public static void main(String[] args) throws Exception {
writeConfigFile("ormlite_config.txt", classes);
}
}
Run Code Online (Sandbox Code Playgroud)
我需要一种方法来每隔一段时间运行一次这个java可执行文件.总结一下:我需要一种在Android Studio中运行java可执行文件的方法.它可以通过Gradle,另一个运行配置,JUnit测试的一部分,我真的不在乎.我只需要能够从AndroidStudio运行它.
这是我目前的Gradle脚本:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 7
targetSdkVersion 18
}
}
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile project(':AndroidLibrary')
compile 'com.j256.ormlite:ormlite-android:4.47' …Run Code Online (Sandbox Code Playgroud) 我一直在讨论即时运行,好像它处于一个很好的状态,但是我和我的团队经常会遇到这个功能的重大问题,并且由于它而导致编码体验降级.
在即时运行之前,我们的干净构建是〜1分30秒,之后我们得到的构建大约是25秒或偶尔的40秒.虽然即时运行确实似乎有时会将构建减少到6-12秒,但有时候,它会导致我们进入疯狂的长版本,我们已经看到长达13分钟,大大抵消了增量编译的任何收益.
它似乎在大多数时候,小的变化仍然需要40秒.有时它是6秒,但这是非常罕见的.
感觉很像是即时运行降低了我们始终如一地高效工作的能力.以下是我们的一些应用程序特定配置:
Android Studio 2.1.1,Android插件2.1
multiDexEnabled true
dexOptions {
preDexLibraries true
javaMaxHeapSize "4g"
maxProcessCount 4
incremental true
dexInProcess true
}
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx6g -XX:MaxPermSize=512m
Run Code Online (Sandbox Code Playgroud)
我们做错了什么,或者有人找到了解决方法吗?
android android-build android-gradle-plugin android-instant-run
每隔几个月,在考虑涉及套接字的个人项目时,我发现自己有一个问题:"如何在动态水平扩展的WebSocket服务器上正确加载平衡套接字?"
我理解水平扩展WebSockets并使用pub/sub模型将数据传递给保存特定用户的套接字连接的正确服务器的理论.我想我理解用最少的当前套接字连接有效识别服务器的方法,我也想要路由新的套接字连接.我不明白的是如何有效地将新套接字连接路由到您使用低套接字计数选择的服务器.
我不认为这个答案会与特定的服务器实现相关联,而是可以应用于大多数服务器.我很容易看到自己用vert.x,node.js甚至完美来实现它.
我正在使用多个文本视图,大量使用跨度.
问题:有时在我的应用程序中(特别是在冰淇淋三明治上),我会看到一个不在文本字符串中的换行符,以及文本复制.有关示例,请参见下图.注意第三个句子是如何开始的,然后是换行符,然后文本被复制并且句子结束.

码:
tv = (TextView) inflater.inflate(R.layout.fragment_reader_list_item, parent, false);
SpannableStringBuilder ssb = ssbList.get(position);
tv.setText(ssb, BufferType.SPANNABLE);
Run Code Online (Sandbox Code Playgroud)
当我调试代码时,变量'ssb'正确地只包含文本......"3不是对你负责的人的霸气,而是成群的例子.4当主人"......
我已经注意到了几个小时的特定内容: 导致错误的条件似乎与渲染文本的整体宽度有关.例如,如上图所示,如果我关闭数字上的粗体跨度,图示文本将正确显示,但是如果我离开粗体跨度,并关闭数字的颜色更改范围(这不会改变总的来说,这个问题仍然存在.
值得注意的是,在每个数字后我都使用了不间断的空间.如果我用不间断的空间交换非破坏空间,我不再看到问题,但这或多或少可能是因为渲染的字符串发生了变化.这个问题可能与跨度没有任何关系,但似乎只有任何旧文本传递的bug太大了.
任何帮助是极大的赞赏!
编辑: 这个错误似乎与使用粗体跨度密切相关.取消数字可以解决问题.这就是我目前使用的解决方法.如果有更好的选择,那就太好了.
我想知道是否有任何为Flow和Mortar Android应用编写单元测试的例子.MVP模式的部分优势在于它提供了表示和视图逻辑的分离,而表示逻辑是您要编写测试的.我希望我能看到一些人们如何使用Flow&Mortar进行此操作,以及他们依赖的库.建立一些最佳实践会很棒.
编辑:值得注意的是,Google刚刚发布了针对Android的junit支持.
我很难找到如何使用RxJava 2创建自定义运算符的示例.我考虑过几种方法:
Observable.create,然后flatMap从源可观察到它.我可以让这个工作,但它感觉不对.我最终创建了一个静态函数,我提供了源代码Observable,然后在源代码上提供了flatMap.在OnSubscribe中,然后我实例化一个传递发射器的对象,它处理和管理Observable/Emitter(因为它不是微不足道的,我希望所有内容尽可能封装).ObservableOperator并提供它Observable.lift.我找不到RxJava 2的任何这样的例子.我必须调试我自己的例子,以确保我对上游和下游的理解是正确的.因为我找不到任何有关RxJava 2的示例或文档,我有点担心我可能会意外地做一些我不应该做的事情.Observable类型.这似乎是底层运营商的工作方式,其中许多都在扩展AbstractObservableWithUpstream.虽然这里有很多事情,但似乎很容易错过一些东西或做一些我不应该做的事情.我不确定我是否应该采取这样的方法.我逐步完成了心理过程,看起来它可以很快变得毛茸茸.我将继续使用选项#2,但认为有必要问一下在RxJava2中支持的方法是什么,并且还要查明是否有任何文档或示例.
我对Objectify很新,我有一个快速的问题,要求做最好的方法:
假设我有一个允许人们发送和接收消息的应用程序(为简单起见,请考虑发送电子邮件).当我的应用加载时,我不想从每个发送消息给给定用户的联系人加载每条消息.那将是一种浪费.相反,我想加载用户有消息的所有联系人(读取或未读取),以便我可以在我的应用程序上显示联系人列表,当用户点击给定联系人时我想加载所有来自该联系人的消息显示给用户.
如果不加载帐户的所有消息,我找不到一个好方法.我在多对一关系中阅读了Objectify wiki,我仍然想不出一个不是非常低效的好方法.客观化网站推荐的方式似乎是,我必须为给定用户加载所有消息,然后解析它们以寻找唯一的联系人.
我正在尝试使用尽可能少的App Engine读取和写入,并尽可能地尝试使用Smalls而不是Reads(运行我的应用程序的总体成本是我的一个大问题,而我正在制作这个) .
在Objectify,我该怎么做?
List在Kotlin中编辑不可变的最佳方法是什么?
我明白这List实际上并不是不可变的,但是如果我将一个List函数传递给函数并且我需要整个列表减去一个元素,那么有没有一种支持的方法来处理它?如果我想要一个带有附加元素的整个列表呢?