小编Lov*_*vis的帖子

从Java访问Kotlin扩展函数

是否可以从Java代码访问扩展函数?

我在Kotlin文件中定义了扩展函数.

package com.test.extensions

import com.test.model.MyModel

/**
 *
 */
public fun MyModel.bar(): Int {
    return this.name.length()
}
Run Code Online (Sandbox Code Playgroud)

哪个MyModel是(生成的)java类.现在,我想用我的普通java代码访问它:

MyModel model = new MyModel();
model.bar();
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.IDE将无法识别该bar()方法,并且编译失败.

使用kotlin的静态函数可以使用什么:

public fun bar(): Int {
   return 2*2
}
Run Code Online (Sandbox Code Playgroud)

通过使用import com.test.extensions.ExtensionsPackage所以我的IDE似乎正确配置.

我搜索了kotlin文档中的整个Java-interop文件,并搜索了很多内容,但我找不到它.

我究竟做错了什么?这甚至可能吗?

java kotlin extension-function

123
推荐指数
5
解决办法
3万
查看次数

艺术:X的验证花了Y ms

我的logcat中有一个警告:

W/art: Verification of void com.myapp.LoginFragment$override.lambda$logIn$5(com.myapp.LoginFragment, java.lang.Throwable) took 217.578ms
Run Code Online (Sandbox Code Playgroud)

这是代码:

subscription = viewModel.logIn()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
               this::showStudioSelection,
               error -> {
                    ErrorResponse errorResponse = ErrorResponseFactory.create(error);

                    if (errorResponse.code() == ApiResult.BAD_REQUEST) {
                       Snackbar.make(getView(), R.string.login_bad_credentials, Snackbar.LENGTH_LONG)
                            .setAction(android.R.string.ok, v -> {})
                            .show();
                    } else {
                        Snackbar.make(getView(), "Unknown error " + errorResponse.code(), Snackbar.LENGTH_LONG)
                            .setAction(android.R.string.ok, v -> {})
                            .show();
                    }
                    viewModel.updateLoginButtonState();
                 }
            );
Run Code Online (Sandbox Code Playgroud)

220ms是相当多的(我觉得我注意到片段启动时滞后).

我正在使用RxJava和retrolambda,但这不是弹出此消息的唯一地点,所以我认为它不直接相关.

我如何影响验证时间?它甚至值得吗?

它似乎与圈复杂度有关,因为我可以通过删除一些更干的代码中的Snackbar.make调用来消除警告:if

String errorMessage;
if (errorResponse.code() == ApiResult.BAD_REQUEST) {
    errorMessage = getString(R.string.login_bad_credentials);
} else {
    errorMessage = …
Run Code Online (Sandbox Code Playgroud)

performance android android-runtime

15
推荐指数
2
解决办法
3873
查看次数

使用Jack编译器时禁用Instant Run

我收到了这条消息gradle:

Instant Run is disabled when Jack compiler is used
Run Code Online (Sandbox Code Playgroud)

我的编译时间太长了.

3:54:11 PM Gradle build finished with 1 warnings(s) in 17m 15s 937ms 
Run Code Online (Sandbox Code Playgroud)

我认为是因为这个消息.

我很担心离线模式.

我的朋友:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion '24.0.0'

    defaultConfig {
        applicationId "*.*.*"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        jackOptions {
            enabled true
        }
        // Enabling multidex support.
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    dexOptions …
Run Code Online (Sandbox Code Playgroud)

android android-jack-and-jill android-instant-run

7
推荐指数
2
解决办法
3922
查看次数

Kotlin - "计算"var属性的用处?

我注意到,当我有一个var带有自定义的属性时get,不使用field标识符,无论如何都会生成一个支持字段.我检查了字节码,文档也这样说:

如果属性使用至少一个访问器的默认实现,或者自定义访问者通过字段标识符引用它,则将为该属性生成支持字段.
(重点是我的)

考虑这样的一个类.由于它是var属性,set因此将生成默认值(因此支持字段):

class Banana {
    var ripeness = 1

    var color: String = "green"
        get() = when {
            ripeness > 80 -> "brown"
            ripeness > 50 -> "yellow"
            else -> "green"
        }
}

val b = Banana()
b.color = "blue"

println(b.color)
Run Code Online (Sandbox Code Playgroud)

但是,println无论我设置什么,它都将始终打印为"绿色" color.无论如何,支持字段将设置为"蓝色".
由于无法在访问器方法之外(或通过反射)访问它,我真的想不出这个的原因.
我在这里错过了什么吗?也许是用例或其他方式访问支持领域?或者它只是一个错误(或IntelliJ中缺少警告)?

kotlin

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

有没有像 Java 或其他流行语言的扩展函数之类的东西?

在 Kotlin 中,我们有一个漂亮的特性,比如扩展。甚至可以将更新的自定义方法添加到其对象已被实例化的超类中。该方法可以被代码中创建的对象访问。

我的问题基本上分为两个。

  1. Java 或其他常用的编程语言中是否有此功能的概念?

  2. 如果之前的答案是否定的,是否有任何解决方法可以在 Java 或其他语言中实现扩展?

java kotlin

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

订阅liveData后如何仅观察新更新的liveData

使用PagedList,这里它没有数据库支持,但是CachedDataList内存中有一个数据列表(称为),可以由fetchMore()函数填充。

拥有PositionalDataSourceDataSource.FactoryPagedList.BoundaryCallback,它在这里只是一个问题。

该流程是PositionalDataSource的loadInitial()开始时将被调用,以开始从中加载数据 CachedDataList,然后再调用loadRange()以继续从CachedDataList按页面大小加载数据 。

CachedDataList页面中的所有数据都被分页后,BoundaryCallback::onItemAtEndLoaded()将调用(如果开始时没有后备数据,则将BoundaryCallback::onZeroItemsLoaded()调用),

在那里,它将开始要求fetchMore将更多数据添加到中CachedDataList,并在将新数据添加到其中时,调用DataSource invalidate()以重新启动新的PagedList和DataSource对,然后loadInitial()再次从PositionalDataSource开始。

它是由

observableCachedData.observe(owner, refreshHandler!!) 
//??? TODO: how to only listen to newly posted data after 
//starting the observe?  
//DOC: 'If LiveData already has data set, it will be delivered to the observer.'

// fetchMore
val didFetch = dataRequester.fetchMore()  //asyc call
Run Code Online (Sandbox Code Playgroud)

在这里,它观察observableCachedData的变化,如果有变化 onChanged(),则

class RefreshHandler(val observableCachedData: …
Run Code Online (Sandbox Code Playgroud)

android pagedlist observer-pattern kotlin android-livedata

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

关于在 RecyclerView 中插入的 notifyItem

我发现IllegalArgumentException: Called attach on a child which is not detached什么时候用它mFeedAdapter.notifyItemInserted(0)来改变数据,找到这个

但解决方案是更改notifyItemInsertednotifyDataSetChanged.
我不想改变功能,因为我想保留动画。我能做什么 ?

android notifydatasetchanged android-recyclerview

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

将SharedPrefs编辑器放在Utility类中?

将静态共享首选项编辑器放在实用程序类中是一个好主意/实践,这样我可以在需要时调用它吗?实用程序类中的方法如下所示:

public static SharedPreferences.Editor editor (Context context){
    final SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
    return sharedPrefs.edit();
}
Run Code Online (Sandbox Code Playgroud)

并在不同的类中使用它:

Utility.editor(mContext).putBoolean(categoryId, true);
Utility.editor(mContext).apply();
Run Code Online (Sandbox Code Playgroud)

java android android-sharedpreferences

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

Kotlin:如何在 RecyclerView.Adapter 中调用 getSupportFragmentManager()

我想在单击事件后调用 RecyclerView.Adapter 中的支持片段管理器,以便移动到不同的片段。我的做法:

(context as MainActivity).supportFragmentManager
                            .beginTransaction()
                            .replace(MainActivity.FRAGMENT_CONTAINER, TextScreen())
                            .commit()
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

kotlin.TypeCastException:null 无法转换为非 null 类型

你能帮助我吗?

android kotlin

5
推荐指数
2
解决办法
2万
查看次数

在不使用 Google Maps 的情况下使用 Google Places API 但在 OSM 地图上显示所选结果

我们想在我们的 android 应用程序中使用 Google Maps API 和 Places Autocomplete API。在使用之前,我们希望明确您使用这些 API 的“使用条款”。我们检查了谷歌文档。但是我们仍然有一些查询,如下所示:

  1. 我们想使用 2 个全屏视图。在第一个视图中,将有一个搜索按钮上方的 OpenStreet 地图。如果用户单击该搜索按钮,将打开第二个视图,其中将有一个搜索栏和空间来显示搜索结果。这里我们想使用 Places Autocomplete API 来搜索地点。以便我们将在此页面中添加“Powered By Google”徽标。

    选择结果后,用户将被重定向到第一个视图(地图页面),该位置将在那里显示为标记。您能否确认这是可以接受的,这是在没有 Google 地图的情况下使用 Places API 的正确方法吗?如果没有,请让我知道这样做的正确方法。

  2. 如果我们在我们的 android 应用程序中使用谷歌地图,如果我们在地图上显示移动的汽车或卡车是否可以接受?是否有任何付费服务可以使用此功能?

谢谢。

android google-maps google-search-api ios google-places-api

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

Kotlin Zip仅每隔一个元素

我有一个List,我基本上想拉链,但只有每一秒.

我的意思是:我希望我的名单[a,1,b,2]成为[(a,1),(b,2)],我目前正在使用zipWith.
但它没有给我预期的结果,它给了我[(a,1),(1,b),(b,2)].

我现在是完全愚蠢的,还是除了忽略每一个元组之外没有其他解决方案?(例如,filter之后添加一个)是否没有运营商?

kotlin

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

六边形架构和 DDD

我有一个关于六边形架构和 DDD 的问题

是否允许从作为参数传递给适配器的持久适配器调用域逻辑?

例子:

class DomainService(private val repositoryPort: RepositoryPort,
                    private val domainService2: DomainService2) {
  fun doSomething(id: String?) {
    repositoryPort.doSomething(id) {
      id: String? ->
      domainService2.doSomething2(id)
    }
    println("Doing something")
  }
}

class DomainService2 {
  fun doSomething2(id: String?) {
    println("Doing something$id")
  }
}

interface RepositoryPort {
  fun doSomething(id: String?, consumer: (id: String?) -> Unit)
}

class RepositoryAdapter : RepositoryPort {
  override fun doSomething(id: String?, consumer: (id: String?) -> Unit) {
    println("checking something, searching in database")
    consumer.invoke(id) // Is it allow here to …
Run Code Online (Sandbox Code Playgroud)

domain-driven-design hexagonal-architecture kotlin

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

Mockito:如何忽略传递依赖

我正在使用mockito进行单元测试.请考虑以下代码段

ThirdPartyClass tpo = mock(ThirdPartyClass.class);
doNothing().when(tpo).someMethod();
Run Code Online (Sandbox Code Playgroud)

ThirdPartyClass我们是来自第三方的罐子tp.jar.现在tp.jar不是一个超级罐子.这是什么ThirdPartyClass样的

class ThirdPartyClass
{
    SomeOtherClass memberObject;

    public ThirdPartyClass(){}

    /*Rest of the code*/
}
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试运行我的单元测试时,我得到java.lang.ClassNotFoundExceptionSomeOtherClass.请记住,这tp.jar不是一个超级jar,所以它有意义,SomeOtherClass不在我的类路径中.

但为什么mockito无法处理这种传递依赖?有没有办法忽略所有传递依赖?

java junit mockito classnotfoundexception

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