Java Arrays.fill()函数在主线程上过早执行?

时间:2018-05-22 10:58:51

标签: java android arrays passwords

此代码位于按钮的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);

任何更好,更直接的技术都会很棒,谢谢。

2 个答案:

答案 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();