首页 > 解决方案 > 只有创建视图层次结构的原始线程才能在 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 部分分开,我该如何解决这个问题?

标签: javaandroidandroid-asynctask

解决方案


您无法在后台任务中更改 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()并采取相应措施。


推荐阅读