Java 函数在主线程上过早执行?

Java 函数在主线程上过早执行?,java,android,arrays,passwords,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

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

代码比给定的代码段稍长,验证了其他一些内容,但在任何时候都不会更改密码

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

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

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

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

如果
BackGroundTask
构造函数不应该更改原始
密码
数组,您可以使用
Arrays.copyOf()
传递该数组的副本

编辑:如果目标是在使用完密码后将其从内存中删除,我将移动
数组.fill(密码“0”)
调用使用
密码
数组的
BackGroundTask
类的方法(或构造函数)的结尾。在这种情况下,您不必创建阵列的副本。

您可以尝试

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

}.execute();

是否要执行
Arrays.fill(密码“0”)
BackGroundTask
完成后?后台任务与当前线程并行执行。因此,调用后的代码行可以与任务并行执行,甚至可以在任务之前执行。如果你不想这样做,就不要使用该功能。是的,或者在构造函数正确地接受它之后,我只想在本例中使用密码后放弃它LoginActivity@Blazing按照建议复制一份可以解决你的问题。另一种方法是在
BackGroundTask
构造函数末尾调用Arrays.fill(仅当
execute()
方法不需要该数组的原始内容时)。这并不能解决问题。pwCopy仍将密码保存在内存中。@在这种情况下,让使用者使用该密码(
BackGroundTask
构造函数或
BackGroundTask
execute
方法在使用完数组后用0填充数组。这是否也会在LoginActivity中处理掉密码数组?我听说java是按值传递的
new BackGroundTask(username, password)
{
     @Override
     protected void onPostExecute(String result) {
           super.onPostExecute(result);
           Arrays.fill(password, '0');
     }

}.execute();