PrimitiveIterator 无法在 Android 中使用 API 脱糖
PrimitiveIterator not working with API De-sugaring in Android
我正在尝试在我的代码中使用 PrimitiveIterator.OfInt、PrimitiveIterator.OfLong 等。我的最低 SDK 版本是 16,因此为了获得 Java 8 类 和接口的支持,我遵循了 API 此处给出的脱糖步骤:
https://developer.android.com/studio/write/java8-support#library-desugaring
因此在我的模块 build.gradle 中,我进行了以下更改:
defaultConfig{
multiDexEnabled true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
coreLibraryDesugaringEnabled true
}
dependecies{
implementation "androidx.multidex:multidex:$multidex_version"
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}
之后我可以使用 类 像“java.util.Instant”、“java.util.Stream”但是仍然不能使用 PrimitiveIterator 接口。它仍然要求为 API 版本 24 添加注释。
这里也显示了对所需接口的支持,但似乎没有。
https://developer.android.com/studio/write/java8-support-table
这很可能是 Lint 问题。
我 运行 下面在使用 API 16 图像的虚拟设备和在 Android 5.1 上运行的 Wiko Lenny 2 上进行的仪器测试(API 22 ).在这两种情况下,当 coreLibraryDesugaringEnabled
设置为 true
时测试成功,当 coreLibraryDesugaringEnabled
设置为 false
时给出 ClassNotFoundException
。
所以我想说的是,标记 Lint 对 @SuppressLint("NewApi")
有问题的语句,你就完成了。
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.PrimitiveIterator;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@RunWith(AndroidJUnit4.class)
public class PrimitiveIteratorTest {
PrimitiveIterator.OfInt intIterator;
@Before
public void setUpIterator() {
intIterator = new PrimitiveIterator.OfInt() {
final int[] intArray = {1,2,3,4,5,6,7,8,9,10};
int index = -1;
@Override
public int nextInt() {
return intArray[++index];
}
@Override
public boolean hasNext() {
return index < intArray.length - 1;
}
};
}
@Test
public void primitiveIteratorTest(){
int first = intIterator.nextInt();
int second = intIterator.nextInt();
assert(first == 1);
assert(second == 2);
assert(intIterator.hasNext());
}
}
我正在尝试在我的代码中使用 PrimitiveIterator.OfInt、PrimitiveIterator.OfLong 等。我的最低 SDK 版本是 16,因此为了获得 Java 8 类 和接口的支持,我遵循了 API 此处给出的脱糖步骤:
https://developer.android.com/studio/write/java8-support#library-desugaring
因此在我的模块 build.gradle 中,我进行了以下更改:
defaultConfig{
multiDexEnabled true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
coreLibraryDesugaringEnabled true
}
dependecies{
implementation "androidx.multidex:multidex:$multidex_version"
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}
之后我可以使用 类 像“java.util.Instant”、“java.util.Stream”但是仍然不能使用 PrimitiveIterator 接口。它仍然要求为 API 版本 24 添加注释。
这里也显示了对所需接口的支持,但似乎没有。 https://developer.android.com/studio/write/java8-support-table
这很可能是 Lint 问题。
我 运行 下面在使用 API 16 图像的虚拟设备和在 Android 5.1 上运行的 Wiko Lenny 2 上进行的仪器测试(API 22 ).在这两种情况下,当 coreLibraryDesugaringEnabled
设置为 true
时测试成功,当 coreLibraryDesugaringEnabled
设置为 false
时给出 ClassNotFoundException
。
所以我想说的是,标记 Lint 对 @SuppressLint("NewApi")
有问题的语句,你就完成了。
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.PrimitiveIterator;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@RunWith(AndroidJUnit4.class)
public class PrimitiveIteratorTest {
PrimitiveIterator.OfInt intIterator;
@Before
public void setUpIterator() {
intIterator = new PrimitiveIterator.OfInt() {
final int[] intArray = {1,2,3,4,5,6,7,8,9,10};
int index = -1;
@Override
public int nextInt() {
return intArray[++index];
}
@Override
public boolean hasNext() {
return index < intArray.length - 1;
}
};
}
@Test
public void primitiveIteratorTest(){
int first = intIterator.nextInt();
int second = intIterator.nextInt();
assert(first == 1);
assert(second == 2);
assert(intIterator.hasNext());
}
}