使用afterTextChanged的Android MultiThreading

时间:2016-11-27 19:12:51

标签: java android multithreading android-textwatcher

我开始使用MultiThreading 我想验证用户输入,所以我查看了问题here

但仍然出于某些原因我的应用程序崩溃了,我无法确定问题

RegisterActivity.Java

/* your base url or your domain name for your application*/
$config['base_url'] = "http://example.com"; 

/*For your default index page generally this is empty */
$config['index_page'] = '';

LoginActivity.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();
    }

栈跟踪

  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();
    }

3 个答案:

答案 0 :(得分:0)

您可能会收到Exception,因为您尝试在后台Dialog中显示Thread。您应该检查电子邮件在onPreExecute()内是否有效,如果它没有显示对话框,那么它就会在用户界面Thread上运行。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

所以,只要做Exception告诉你的事情:

  

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

编辑:

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

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