我正在尝试实现基于密码的加密算法,但是我得到了这个例外:
javax.crypto.BadPaddingException:给定最终块未正确填充
可能是什么问题?(我是Java新手.)
这是我的代码:
public class PasswordCrypter {
private Key key;
public PasswordCrypter(String password) {
try{
KeyGenerator generator;
generator = KeyGenerator.getInstance("DES");
SecureRandom sec = new SecureRandom(password.getBytes());
generator.init(sec);
key = generator.generateKey();
} catch (Exception e) {
e.printStackTrace();
}
}
public byte[] encrypt(byte[] array) throws CrypterException {
try{
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(array);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public byte[] decrypt(byte[] array) throws CrypterException{
try{
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(array);
} …
Run Code Online (Sandbox Code Playgroud) 我有一个Observable<<List<Foo>> getFoo()
从Retrofit服务创建的,在调用该
.getFoo()
方法后,我需要与多个订阅者共享它..share()
但是,调用该方法会导致重新执行网络呼叫.重播运算符也不起作用.我知道可能有一个潜在的解决方案.cache()
,但我不知道为什么会出现这种行为.
// Create an instance of our GitHub API interface.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
// Create a call instance for looking up Retrofit contributors.
Observable<List<Contributor>> testObservable = retrofit
.create(GitHub.class)
.contributors("square", "retrofit")
.share();
Subscription subscription1 = testObservable
.subscribe(new Subscriber<List<Contributor>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(List<Contributor> contributors) {
System.out.println(contributors);
}
});
Subscription subscription2 = testObservable
.subscribe(new …
Run Code Online (Sandbox Code Playgroud) 在Java中,要在实例化新对象时覆盖方法,我们可以这样做
public ActivityTestRule<MainActivity> rule = new ActivityTestRule<MainActivity>(
MainActivity.class) {
@Override
protected void beforeActivityLaunched() {
// implement code
super.beforeActivityLaunched();
}
};
Run Code Online (Sandbox Code Playgroud)
如何在Kotlin做到这一点?我尝试了这段代码,但无法编译.
@Rule @JvmField
var rule = ActivityTestRule<MainActivity>(MainActivity::class.java) {
override fun beforeActivityLaunched() {
super.beforeActivityLaunched()
}
}
Run Code Online (Sandbox Code Playgroud) 我已经在这个问题上工作了好几个星期,我仍然无法解决这个问题.
所以,我有一个包含带有ImageView的LinearLayout的CardView.
没有该半径,Shared Element Transition可以无缝地工作.但是,当我将半径(app:cardCornerRadius ="25dp")添加到该CardView时,共享元素转换看起来很难看,因为它首先删除半径然后开始动画.
第一种方法:ObjectAnimator
我创建了ObjectAnimator来为卡上的半径值设置动画,并在动画结束后开始转换.
ObjectAnimator animator = ObjectAnimator
.ofFloat(view, "radius", AppUtil.dpAsPixel(this, 25), 0);
animator.setDuration(150);
animator.addListener( // start new Activity with Transition );
animator.start();
Run Code Online (Sandbox Code Playgroud)
这有效,但看起来不太好,因为转换在开始转换之前等待动画完成.我需要的是半径是在转换到新Activity时的动画(类似于TransitionSet中的ORDERING_TOGETHER).
第二种方法 - ChangeImageTransform
我已经阅读了StackOverflow帖子来使用Transformation Class,如ChangeImageTransform和ChangeBounds.
我确实定义了我建议的应用程序主题(my_transition包含ChangeImageTransform transitionSet)
<item name="android:windowSharedElementEnterTransition">@transition/my_transition</item>
<item name="android:windowSharedElementExitTransition">@transition/my_transition</item>
Run Code Online (Sandbox Code Playgroud)
但它不起作用..
第三种方法 - 天真
我的最后一次尝试是强制目标ImageView的半径也是25dp.因为目标ImageView可能是方形的,因此可能我的CardView被转换为方形,但正如您所猜测的那样,它不起作用.
第四种方法 - 不使用CardView
如您所见,我正在使用Penguin图像并使用CardView来制作半径.我可以使用图像转换使图像四舍五入,但我仍然认为这不是创建共享元素转换的正确方法.
这是我的问题,有没有办法使CardView半径的共享元素转换工作而不首先删除半径?
android android-animation android-transitions android-cardview shared-element-transition
我正在使用Android Studio 3.0 Preview来启动新的Kotlin项目.当我尝试在build.gradle
我看到implementation
范围而不是通常时添加依赖项compile
.
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation 'com.android.support:appcompat-v7:25.3.1'
testImplementation 'junit:junit:4.12'
Run Code Online (Sandbox Code Playgroud)
还有androidTestImplementation
和testImplementation
范围.
最后,我添加compile
添加第三方依赖项,它的工作原理.
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
Run Code Online (Sandbox Code Playgroud)
所以我的问题是......
implementation
,androidTestImplementation
和testImplementation
范围是什么?compile
,testCompile
和androidTestCompile
?编辑:我的不好,这个问题不是Kotlin具体的.这是新的Android Gradle Plugin配置.
我正在尝试使用最近在 Android 中引入的 UsageStatsManager 类读取应用程序上次使用的时间。
但是有一个问题。它为大多数应用程序提供了正确的结果。但是对于某些呼叫应用程序:appUsageStats.get(appInformation.packageName).getLastTimeUsed()
它返回一个不正确的 4 位毫秒。
附件是评估窗口的屏幕截图,显示 8738 为真正的呼叫者应用程序。这是一个错误还是我做错了什么?
注意:作为观察,当mLastTimeSystemUsed
与mLastTimeUsed
. 仅供参考。
下面的代码片段:
Map<String, UsageStats> appUsageStats = UStats.getMapOfAggregatedUsage(MainActivity.this);
if(appUsageStats.get(appInformation.packageName)!=null) {
long used = appUsageStats.get(appInformation.packageName).getLastTimeUsed();
long installedDiff2 = new Date().getTime() - new Date(used).getTime();
long daysGap = TimeUnit.DAYS.convert(installedDiff2, TimeUnit.MILLISECONDS);
if(daysGap == 0) {
appInfoObj.setAppUsedDate("Used : Today");
} else {
appInfoObj.setAppUsedDate("Used : " + String.valueOf(daysGap) + " days ago");
}
appInfoObj.setAppUsedDateNumber(daysGap);
}
Run Code Online (Sandbox Code Playgroud)
UStats 类方法:
public static Map<String, UsageStats> getMapOfAggregatedUsage(Context context) {
Calendar calendar = Calendar.getInstance();
long …
Run Code Online (Sandbox Code Playgroud) 在 Kotlin(和 Java 8)中,我们可以使用 Lambda 表达式来移除样板回调接口。例如,
data class Profile(val name: String)
interface ProfileCallback {
fun onSuccess(profile: Profile)
}
class ProfileRepository(val callback: ProfileCallback) {
fun getProfile() {
// do calculation
callback.onSuccess(Profile("name"))
}
}
Run Code Online (Sandbox Code Playgroud)
我们可以把removeProfileCallback
改成Kotlin的Lambda:
class ProfileRepository(val callback: (Profile) -> Unit) {
fun getProfile() {
// do calculation
callback(Profile("name"))
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我不确定如何模拟然后验证该功能。我试过像这样使用 Mockito
@Mock
lateinit var profileCallback: (Profile) -> Unit
@Test
fun test() {
// this wouldn't work
Mockito.verify(profileCallback).invoke(any())
}
Run Code Online (Sandbox Code Playgroud)
但它抛出一个异常:
org.mockito.exceptions.base.MockitoException: ClassCastException 在创建 mockito 模拟时发生:要模拟的类:'kotlin.jvm.functions.Function1',由类加载器加载:'sun.misc.Launcher$AppClassLoader@7852e922'
如何在 Kotlin 中模拟和验证 Lambda …
我有一个与懒惰加载视图/布局性能相关的问题.有时我们想要动态显示/隐藏多个视图.在这种情况下,我们有四种选择:
哪一个性能最好?我一直在谷歌搜索,发现ViewStub专门为此设计,但我不确定.也许我错了,或者甚至还有第五种选择,我不知道.您对此有不同的看法或经验吗?谢谢!
在Gradle项目中,我们可以定义多个远程/本地Maven存储库。
buildscript {
repositories {
mavenLocal()
mavenCentral()
jCenter()
maven {
url 'https://example1.mavenrepo.com/public'
}
maven {
url "https://example2.mavenrepo.com/release"
}
}
dependencies {
classpath 'com.example.mydependencies:mylibrary:1.0.0'
}
}
Run Code Online (Sandbox Code Playgroud)
如果mylibrary
存在于所有Maven回购中。Gradle将选择哪一个?我可以配置Gradle只下载mylibrary
某些Maven仓库吗?
如果玩家在真实时按下Button-Tile,则会变为false.如果玩家在假的时候踩下Button-Tile,那么它就变成了现实.
问题是,当玩家站在(相交)Button-Tile时,它会不断更新条件.所以,从真实来看,它变得虚假.因为它的错误和玩家相交,它再次成为现实.真假真假 - 等等.
我使用ElapsedGameTime使更新过程变慢,玩家有机会将Button更改为true或false.
但是,这不是我想要的解决方案.当玩家站在按钮区块上时,还有其他方法可以使其保持在False/True状态吗?
android ×7
kotlin ×3
gradle ×2
java ×2
android-view ×1
build.gradle ×1
cryptography ×1
encryption ×1
exception ×1
javax.crypto ×1
lambda ×1
maven ×1
mockito ×1
retrofit ×1
rx-java ×1
testing ×1
xna ×1
xna-4.0 ×1