java - 只有创建视图层次结构的原始线程才能在 asynctask 中触及其视图错误
问题描述
我正在使用View.OnClickListener
. 代码如下:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.appCompatButtonLogin:
AsyncTaskRunner runner = new AsyncTaskRunner();
runner.execute();
break;
case R.id.textViewLinkRegister:
// Navigate to RegisterActivity
Intent intentRegister = new Intent(getApplicationContext(), RegisterActivity.class);
startActivity(intentRegister);
break;
}
}
我的AsyncTask
课是这样的:
private class AsyncTaskRunner extends AsyncTask<String, String, String> {
ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this);
@Override
protected void onPreExecute() {
if (progressDialog == null) {
progressDialog.setIndeterminate(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setCancelable(false);
progressDialog.setMessage("Please wait!");
progressDialog.show();
}
super.onPreExecute();
}
@Override
protected String doInBackground(String... strings) {
try {
verifyFromSQLite();
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
private void verifyFromSQLite() {
if (inputValidation.isInputEditTextFilled(textInputEditTextEmail, textInputLayoutEmail, getString(R.string.error_message_email))) {
return;
}
if (inputValidation.isInputEditTextEmail(textInputEditTextEmail, textInputLayoutEmail, getString(R.string.error_message_email))) {
return;
}
if (inputValidation.isInputEditTextFilled(textInputEditTextPassword, textInputLayoutPassword, getString(R.string.error_message_email))) {
return;
}
if (databaseHelper.checkUser(textInputEditTextEmail.getText().toString().trim()
, textInputEditTextPassword.getText().toString().trim())) {
Intent accountsIntent = new Intent(activity, UsersListActivity.class);
accountsIntent.putExtra("EMAIL", textInputEditTextEmail.getText().toString().trim());
emptyInputEditText();
startActivity(accountsIntent);
} else {
Toast.makeText(LoginActivity.this, "Please check your credentials", Toast.LENGTH_SHORT).show();
}
}
private void emptyInputEditText() {
textInputEditTextEmail.setText(null);
textInputEditTextPassword.setText(null);
}
@Override
protected void onPostExecute(String s) {
if (progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
}
当我运行我的代码时,我得到exception
这样的:
只有创建视图层次结构的原始线程才能接触其视图
我正在尝试将 UI 与异步任务中的非 UI 部分分开,我该如何解决这个问题?
解决方案
您无法在后台任务中更改 UI。
移动这段代码:
Intent accountsIntent = new Intent(activity, UsersListActivity.class);
accountsIntent.putExtra("EMAIL", textInputEditTextEmail.getText().toString().trim());
emptyInputEditText();
startActivity(accountsIntent);
和
Toast.makeText(LoginActivity.this, "Please check your credentials", Toast.LENGTH_SHORT).show();
到onPostExecute()
.
您可以将值设置boolean
为这些情况的标志,doInBackground()
并将它们签入onPostExecute()
并采取相应措施。
推荐阅读
- java - 使用 class.cast 转换从 Redis 接收的对象失败并使用 ObjectMapper.convertValue 工作
- node.js - Node JS Worker Threads 核心使用
- postgresql - 如何获取具有连接的postgresql中具有相同ID的多条记录的事务表的最后一条记录?
- r - 数据框删除单元格内的重复值
- git - 上一次提交的 Git cherrypick
- python - 如何在 python 3 中使用户输入不区分大小写?
- angular - PrimeNG模板中的表格不显示
- html - 输入字段在错误的输入字段上保存了密码
- amazon-web-services - AWS Lambda 被执行 3 次
- c++ - c ++类读取ascii文件并进行操作