构造函数可见性仅限于文件

我想创建一个更简单的方法来处理SharedPreferences。 我想叫它的方式就是这样 获得偏好: val email = SharedPrefs.userdata.email val wifiOnly = SharedPrefs.connections.wifiOnly 设置偏好: SharedPrefs.userdata.email = "someone@example.com" SharedPrefs.connections.wifiOnly = true 我可以这样做: App.instance在下面的代码片段中返回一个Context对象 object SharedPrefs { val userdata by lazy { UserPreferences() } val connections by lazy { ConnectionPreferences() } class UserPreferences { private val prefs: SharedPreferences = App.instance.getSharedPreferences("userdata", Context.MODE_PRIVATE) var email: String get() = prefs.getString("email", null) set(value) […]

如何使用Firebase服务器时间戳生成日期?

目前,Google版本的ServerValue.TIMESTAMP返回{".sv":"timestamp"} ,一旦将数据保存到Firebase服务器,该版本将用作Firebase的指令,以便用该服务器时间戳填充该字段。 但是,当您在客户端创建数据时,您还没有实际的时间戳(即用作创建日期)。 在初始保存和随后的检索之后,您只能访问时间戳,我想 – 这有时为时已晚,不够优雅。 Google之前: 更新:忽略这一部分,因为它是不正确的 – 我误解了这些例子。 ServerValue.TIMESTAMP总是返回{".sv":"timestamp"} 。 据我所知,在谷歌Firebase之前,似乎有一个服务器生成的时间戳,允许您获取实际的时间戳: import com.firebase.client.ServerValue; ServerValue.TIMESTAMP // eg. 1466094046 ( 参考文献1 , 参考文献2 ) 问题: 这样的保存/检索是获得我的模型实例上的服务器生成的创建日期的唯一方法吗? 如果是的话,你能提出一个实施这种模式的方法吗? 我是否正确理解ServerValue.TIMESTAMP随着Google收购Firebase而改变? 更新:不,@FrankvanPuffelen回复说,收购过程中没有任何变化。 注意: 我不考虑在客户端使用new Date() ,因为我一直在阅读它是不安全的,但如果你认为不同,请分享你的想法。

如何在多项目中使用Spek来设置Jacoco?

我想要测量雅科科在儿童项目之一的model项目中的覆盖面。 然而,在test任务之后, jacocoTestReport任务被跳过。 test : :model:compileKotlin UP-TO-DATE :model:compileJava UP-TO-DATE :model:copyMainKotlinClasses UP-TO-DATE :model:processResources UP-TO-DATE :model:classes UP-TO-DATE :model:compileTestKotlin UP-TO-DATE :model:compileTestJava UP-TO-DATE :model:copyTestKotlinClasses UP-TO-DATE :model:processTestResources UP-TO-DATE :model:testClasses UP-TO-DATE 3 10, 2017 8:17:48 org.junit.platform.launcher.core.ServiceLoaderTestEngineRegistry loadTestEngines Discovered TestEngines with IDs: [spek] :model:junitPlatformTest Test run finished after 113 ms [ 4 containers found ] [ 0 containers skipped ] [ 4 […]

扩展方法和扩展属性是不好的做法吗?

所以如果扩展方法和扩展属性真的是静态的方法和属性。 静态方法和属性和方法不是线程安全的,因此应该避免使用扩展方法和扩展属性。 我们只是被欺骗,因为我们编写的代码将显示为漂亮或干净,但性能方面则不然。 这是真的?

需要共享corda节点间的静态可变映射

美好的一天, 我一直在试图改变从AMQP到FTL的corda框架的消息层。 我试图通过创建一个地图,我把一个InboxSubscriber对象关联到一个特定的p2p地址。 p2p地址只是一个字符串,可以从参数target:MessageRecipients中检索。 我在ArtemisMessagingServer类中添加了一个静态MutableMap,并添加了一个对应的InboxSubscriber对象,该对象由正在初始化的服务器的p2p地址进行了键入。 我曾希望这个地图将是一个所有的corda节点,但我注意到,实际上我有一个每个节点的地图,因此我无法获得其他节点相应的InboxSubscriber对象本身。 是否有一个特定的位置可以创建这个地图,然后由网络中的所有节点进行检索?

为什么这个anko布局不正确地处理系统ui?

我尝试了Anko,不能得到这个布局来处理像xml版本的系统用户界面。 我认为它与主题有关,以及它们是如何通过xml解析来处理的。 这里是截图: 这里是anko DSL组件: class ActivityMainLayout : AnkoComponent<Activity> { lateinit var drawerLayout: DrawerLayout lateinit var appBarLayout: AppBarLayout lateinit var toolbar: Toolbar lateinit var text: TextView lateinit var navHeader: NavigationView lateinit var toggle: ActionBarDrawerToggle override fun createView(ui: AnkoContext<Activity>): View = with(ui) { drawerLayout = drawerLayout { fitsSystemWindows = true coordinatorLayout { appBarLayout = appBarLayout(theme = […]

未解决的参考:T

我需要创建一个数据类: data class MyClass(val b: Boolean, val s: String, val flags: Map<Key<T>, T>) 由于“未解决的参考:T” 在flags映射中,我需要Key<String>, String和Key<Int>, Int对,但不要Key<String>, Int 任何想法,我怎么能做到这一点?

RxAndroid – 使用RxView.touches清除其他处理程序

我正在尝试将触摸处理程序添加到FabricView ,但似乎这样做我无法再绘制。 事实上,FabricView本身定义了一个Touch处理程序,但似乎我使用RxAndroid2来清除预定义的处理程序,而不是链接到它。 我想要的是能够使用我的处理程序,而不必清除现有的。 这是我主要活动的一部分(sketchview是FabricView的一个实例) sketchView.backgroundMode = FabricView.BACKGROUND_STYLE_NOTEBOOK_PAPER RxView.touches(sketchView, {_ -> true}).subscribe { // setting to false let me sketch, but I don't get any toast event -> when(event.action){ MotionEvent.ACTION_DOWN -> { toast("Starting") } MotionEvent.ACTION_UP -> { toast("Stopping") } else -> {} } } 这是我的app.gradle提取: compile 'com.github.antwankakki:FabricView:latest' compile 'com.rmtheis:tess-two:7.0.0' compile "io.reactivex.rxjava2:rxjava:2.1.0" compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0' […]

如何在Android应用程序中调试“SQL(查询)错误或缺少数据库”?

10-02 01:31:57.697 22242-22242/com.example.android.mynotes E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.android.mynotes, PID: 22242 java.lang.IllegalStateException: Could not execute method for android:onClick at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) at android.view.View.performClick(View.java:5697) at android.widget.TextView.performClick(TextView.java:10826) at android.view.View$PerformClick.run(View.java:22526) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:158) at android.app.ActivityThread.main(ActivityThread.java:7224) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) at android.view.View.performClick(View.java:5697) at android.widget.TextView.performClick(TextView.java:10826) at android.view.View$PerformClick.run(View.java:22526) […]

TornadoFX如何在编辑TableView时添加验证

考虑下面的例子: class Item(name: String, number: Int) { val nameProperty = SimpleStringProperty(name) var name by nameProperty val numberProperty by lazy { SimpleIntegerProperty(number) } var number by numberProperty } class MainView : View("Example") { val items = listOf(Item("One", 1), Item("Two", 2)).observable() override val root = vbox { tableview(items) { column("Name", Item::nameProperty).makeEditable() column("Number", Item::numberProperty).makeEditable(NumberStringConverter()) enableCellEditing() } } } […]