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.this
到 alertDialog()
作为要使用的上下文。
我开始使用多线程作为 我想去验证用户输入,所以我查看了问题 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.this
到 alertDialog()
作为要使用的上下文。