Android 带有 afterTextChanged 的​​多线程

Android MultiThreading with afterTextChanged

我开始使用多线程作为 我想去验证用户输入,所以我查看了问题 here

但由于某些原因我的应用程序崩溃了,我无法查明问题所在

RegisterActivity.Java

@Override
    public void afterTextChanged(final Editable editable) {
        email = etEmail.getText().toString();
        new AsyncTask<Void, Void, Void>() {
            protected Void doInBackground(Void... params) {
                if( !isValidEmail(email))
                    LoginActivity.alertDialog(getApplicationContext(),"test","test");
                    return null;
            }

        }.execute();
    }

LoginActivity.java(是的,我知道这个函数不应该出现在这里)

  public static   void alertDialog(Context context, CharSequence message, CharSequence type){
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setMessage(message)
                .setNegativeButton(type, null)
                .create()
                .show();
    }

堆栈跟踪

E/AndroidRuntime: FATAL EXCEPTION: main Process:com.example.ofir.bopofinal, PID: 3038
                                                                                  java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
                                                                                      at android.support.v7.app.AppCompatDelegateImplV9.createSubDecor(AppCompatDelegateImplV9.java:351)
                                                                                      at android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor(AppCompatDelegateImplV9.java:320)
                                                                                      at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:281)
                                                                                      at android.support.v7.app.AppCompatDialog.setContentView(AppCompatDialog.java:83)
                                                                                      at android.support.v7.app.AlertController.installContent(AlertController.java:214)
                                                                                      at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:258)
                                                                                      at android.app.Dialog.dispatchOnCreate(Dialog.java:394)
                                                                                      at android.app.Dialog.show(Dialog.java:295)
                                                                                      at com.example.ofir.bopofinal.LoginRegister.LoginActivity.alertDialog(LoginActivity.java:53)
                                                                                      at com.example.ofir.bopofinal.LoginRegister.RegisterActivity.onPostExecute(RegisterActivity.java:162)
                                                                                      at com.example.ofir.bopofinal.LoginRegister.RegisterActivity.onPostExecute(RegisterActivity.java:153)
                                                                                      at android.os.AsyncTask.finish(AsyncTask.java:651)
                                                                                      at android.os.AsyncTask.-wrap1(AsyncTask.java)
                                                                                      at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                      at android.os.Looper.loop(Looper.java:148)
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)

您得到的可能是 Exception,因为您正试图从背景 Thread 中显示 Dialog。您应该检查电子邮件在 onPreExecute() 中是否有效,如果它不显示对话框,那么因为它在 UI Thread.

上运行

编辑:确保您的 activity 正在扩展 AppCompatActivity 并且您正在导入 android.support.v7.app.AlertDialog 而不是标准的。然后,如下更改 AsyncTask :

doInBackground() 方法可以执行长运行 操作但不能与UI 交互。为此,您应该使用 onPreExecute() 和 onPostExecute() 方法,如下所示:

new AsyncTask<Void, Void, Boolean>() {
        protected Boolean doInBackground(Void... params) {
            if( !isValidEmail(email))
                return false;
            return true;
        }

        protected void onPostExecute(Boolean isEmailValid) {
            //isEmailValid is the variable received from the doInBackground() method
            if(!isEmailValid)
                LoginActivity.alertDialog(getApplicationContext(),"test","test");
        }
    }.execute();

所以,按照异常告诉你的去做:

You need to use a Theme.AppCompat theme (or descendant) with this activity.

编辑:

您正在将 ApplicationContext 传递给 AlertDialog.Builder() 构造函数。构建器试图从该上下文中获取它的主题,因为它是 ApplicationContext 而不是 Activity,它将采用应用程序本身的主题,这似乎不是 Theme.AppCompat 或后代。

无需重写大部分代码,如果您通过 this resp,它应该可以工作。 (当从 AyncTask 中调用时)RegisterActivity.thisalertDialog() 作为要使用的上下文。