我开始使用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();
}
答案 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.this
到alertDialog()
作为要使用的上下文。