我如何在 AsyncTasks 结束时更改视图?

How can i alter view at AsyncTask's end?

我有一个查询数据库的 AsyncTask,然后是 return boolean

我正在尝试通过 onPostExecute 方法关闭进度条可见性。我得到

nullpointerexception: Attempt to invoke virtual method 'void android.widget.ProgressBar.setVisibility(int)' on a null object reference

因为我无法正确引用它。

我应该怎么做?

AsyncTask:

public class TarefaValidaEmail extends AsyncTask<String, Void, Boolean> {
private Context context;
private Cadastro cadastro = new Cadastro();

public TarefaValidaEmail(Context context){
    this.context = context;
}

@Override
protected Boolean doInBackground(String... params) {
    String email = params[0];

    Log.d("STRING BACKGROUND: ", email);

    UsuarioDAO dao = new UsuarioDAO();
    boolean isEmailValido = dao.isEmailValido(email);

    return isEmailValido;
}

@Override
protected void onPostExecute(Boolean isEmailValido){
    cadastro.isEmailValido(isEmailValido);
    cadastro.progress.setVisibility(View.INVISIBLE);
}
}

Activity(地籍):

public class Cadastro extends AppCompatActivity {

//Setando variáveis
    //STANDS-FOR: Conferir password
        private boolean senhaOk = false;
        private boolean senhaOkFinal = false;
        boolean emailValido;
        EditText etEmail;
        ProgressBar progress;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cadastro);

    //Cacheing EditTexts
    final EditText etNome = (EditText) findViewById(R.id.etNome);

    final EditText etSenha = (EditText) findViewById(R.id.etSenha);
    final EditText etSenhaVerify = (EditText) findViewById(R.id.etSenhaVerify);
    progress = (ProgressBar) findViewById(R.id.progress_email);
    etEmail = (EditText) findViewById(R.id.etEmail);

    //Ajustando fonte e inputType dos passwords
    etSenha.setTypeface(Typeface.DEFAULT);
    etSenha.setTransformationMethod(new PasswordTransformationMethod());
    etSenhaVerify.setTypeface(Typeface.DEFAULT);
    etSenhaVerify.setTransformationMethod(new PasswordTransformationMethod());

    ... ( Some code ) ...

    //Adiciona TextWatchers (Listeners) aos campos de senha
    etSenha.addTextChangedListener(twSenha);
    etSenhaVerify.addTextChangedListener(twSenhaVerify);

    //Loader animation & check-email
    etEmail.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                progress.setVisibility(View.VISIBLE);

                TarefaValidaEmail tarefa = new TarefaValidaEmail(Cadastro.this);
                tarefa.execute(etEmail.getText().toString());
            }
        }
    });

}

//Metodo que recebe verificação do email
public void isEmailValido(Boolean isValido){

    progress.setVisibility(View.INVISIBLE);

}

}

已经在 Cadastro activity 和 Tarefa AsyncTask class 上尝试过 Cadastro.this.progress.setVisib..。谢谢!

关闭 onpostexecute() 方法中的进度条

progress.dismiss();

这里:

private Cadastro cadastro = new Cadastro();

导致问题的行。

因为您要将 Cadastro.this 发送到 TarefaValidaEmail class 所以访问 progress 为:

public TarefaValidaEmail(Context context){
    this.context = context;
    this.cadastro=((Cadastro)context);
}