【问题标题】:Java Arrays.fill() function executes prematurely on main thread?Java Arrays.fill() 函数在主线程上过早执行?
【发布时间】:2018-11-01 02:57:29
【问题描述】:

此代码位于按钮的 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() 函数。

代码比给定的 sn-p 长一点,验证了其他几件事,但在任何时候都不会更改密码。

我已经到处找了很长一段时间,但什么也没找到。 我看到的唯一解决方案是使用一个在几百毫秒后执行的处理程序,它用零填充密码。

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {

        Arrays.fill(password, '0');
    }
 }, 100);

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

【问题讨论】:

  • 你想在BackGroundTask完成后执行Arrays.fill(password, '0');吗?
  • 后台任务与当前线程并行执行。因此,在其调用之后的代码行可以与任务并行执行,甚至可以在任务之前执行。如果您不想这样做,请不要使用该功能。
  • 可以,或者在构造函数正确接受之后

标签: java android arrays passwords


【解决方案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'); 调用移动到使用password 数组。在这种情况下,您不必创建数组的副本。

【讨论】:

  • 我只想在此 LoginActivity 中使用密码后丢弃密码
  • @Blazing 按照建议进行复制将解决您的问题。另一种方法是在 BackGroundTask 构造函数的末尾调用 Arrays.fill(仅当 execute() 方法不需要该数组的原始内容时)。
  • 这并不能解决问题。 pwCopy 仍然在内存中保存密码。
  • @Blazing 在这种情况下,让该密码的使用者(BackGroundTask 构造函数或BackGroundTaskexecute 方法在使用完成后用 0 填充数组。跨度>
  • 这是否也处理了 LoginActivity 中的密码数组?听说java是传值的
【解决方案2】:

你可以试试

new BackGroundTask(username, password)
{
     @Override
     protected void onPostExecute(String result) {
           super.onPostExecute(result);
           Arrays.fill(password, '0');
     }

}.execute();

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 2018-01-02
    • 2019-12-13
    • 2012-11-15
    • 2015-10-27
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多