此代码位于按钮的OnClickListner
下String username = edtLabel.getText().toString():
char[] password = new char[edtPassword.getText().length()];
edtPassword.getText().getChars(0, edtPassword.getText().length(), password,0);
new BackGroundTask(username, password).execute();
Arrays.fill(password, '0');
我面临的问题是传递给BackGroundTask构造函数(AsyncTask类)的密码始终是一个零{0,0,0}的数组。虽然我在设置构造函数后调用了Arrays.fill()函数。
代码比给定的代码段长一点,验证了其他一些内容,但在任何时候都不会更改密码。
我一直在寻找相当长的一段时间,却找不到任何东西。 我看到的唯一解决方案是使用一个Handler,它在几百毫秒后执行,用零填充密码。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Arrays.fill(password, '0');
}
}, 100);
任何更好,更直接的技术都会很棒,谢谢。
答案 0 :(得分:1)
如果BackGroundTask
构造函数不应该更改原始password
数组,则可以使用Arrays.copyOf()
传递该数组的副本。
char[] pwCopy = Arrays.copyOf(password,password.length);
new BackGroundTask(username, pwCopy).execute();
Arrays.fill(password, '0');
编辑:如果目标是在完成使用后从内存中删除密码,我会将Arrays.fill(password, '0');
调用移到BackGroundTask
方法(或构造函数)的末尾使用password
数组的类。在这种情况下,您不必创建数组的副本。
答案 1 :(得分:0)
你可以尝试
new BackGroundTask(username, password)
{
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Arrays.fill(password, '0');
}
}.execute();