【问题标题】:Android MultiThreading with afterTextChanged带有 afterTextChanged 的​​ Android 多线程
【发布时间】:2016-11-27 19:12:51
【问题描述】:

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

这个问题

但由于某种原因,我的应用程序崩溃了,我无法确定问题所在

注册活动.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$3.onPostExecute(RegisterActivity.java:162)
                                                                                      at com.example.ofir.bopofinal.LoginRegister.RegisterActivity$3.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)

【问题讨论】:

    标签: java android multithreading android-textwatcher


    【解决方案1】:

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

    您需要在此活动中使用 Theme.AppCompat 主题(或后代)。

    编辑:

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

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

    【讨论】:

    • 我在 manifest.xml 中做了android:theme="@style/Theme.AppCompat"&gt; 并且得到了相同的结果,错误指向alertDialog 函数中的.show()
    • 我想我找到了问题 - 请参阅我编辑的答案。
    • 是的,你或许应该摆脱静态方法,这是可能的。您也许可以将 alertDialog 方法移动到两个活动的 RegisterActivity 类或某个基类,如果您在它们中都使用它的话。感谢您接受我的回答,顺便说一句。
    • 两项活动都需要大修
    【解决方案2】:

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

    【讨论】:

    • onPreExecute() 不起作用,你是对的,这就是为什么我得到Exception 但我不知道如何解决它
    • 我不知道你所说的“没有工作”是什么意思。你能说得更具体点吗?
    • java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
    • 对于 AlertDialog 类,导入 support.v7 版本而不是标准版本。当您发布这样的问题时,请包含您的 logcat 中的 stacttrace。
    • 请将堆栈跟踪作为您问题的一部分发布。此堆栈跟踪表明您的 AsyncTask 甚至没有运行。
    【解决方案3】:

    编辑:确保您的活动正在扩展 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();
    

    【讨论】:

    • com.example.ofir.bopofinal.LoginRegister.LoginActivity.alertDialog(LoginActivity.java:53)获得相同的error java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
    • @styx - 请发布您崩溃的堆栈跟踪。从概念上讲,rhari 的回答似乎是正确的。也许坠机的原因有所不同。
    • @rhari 我的应用已经在扩展 AppCompatActivity 并导入 importing android.support.v7.app.AlertDialog
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多