Android 必须从UI线程调用方法getText()
我无法解决这个错误。请帮帮我。我有两种方法:Android 必须从UI线程调用方法getText(),android,Android,我无法解决这个错误。请帮帮我。我有两种方法: public boolean isEmailValid(String email) { boolean flag; CharSequence inputStr = email.trim(); Pattern pattern = Pattern.compile(EXPRESSION, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.ma
public boolean isEmailValid(String email) {
boolean flag;
CharSequence inputStr = email.trim();
Pattern pattern = Pattern.compile(EXPRESSION,
Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(inputStr);
if (matcher.matches())
flag = true;
else {
flag = false;
}
return flag;
}
public boolean isFieldsEmpty(String login, String mdp) {
Boolean result = true;
if (login.equals("") || mdp.equals("")) {
result = true;
} else {
result = false;
}
return result;
}
class LoginUser extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute(){
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
prefs = getSharedPreferences("PFE_Prefs",MODE_PRIVATE);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
progressBar.setVisibility(View.GONE);
switch (s) {
case "Champs_vides":
Toast.makeText(getApplicationContext(), "Merci de bien vouloir remplir tous les champs, svp", Toast.LENGTH_SHORT).show();
EmailEditText.setText("");
MdpEditText.setText("");
break;
case "Email_incorrect":
Toast.makeText(getApplicationContext(),"Merci de bien vouloir verifier votre adresse email, svp", Toast.LENGTH_SHORT ).show();
EmailEditText.setText("");
MdpEditText.setText("");
break;
case "Success": //Appel a l'activité Tableau de bord
Intent toDashBord = new Intent(getApplicationContext(), DashBoardActivity.class);
startActivity(toDashBord);
LoginActivity.this.finish();
break;
case "Echoué" :
Toast.makeText(getApplicationContext(),"Merci de bien vouloir verifier votre connexion, svp", Toast.LENGTH_SHORT ).show();
EmailEditText.setText("");
MdpEditText.setText("");
break;
}
}
我的问题出现在EmailEditText.getText().toString()
中,我得到以下错误:
Method getText() must called from UI thread, currently inferred thread is worker
必须在主应用程序线程上调用getText()
<正在后台线程上调用code>doInBackground()
在执行任务之前,从EditText
中获取值,并将其提供给AsyncTask
(例如,通过构造函数)。必须在主应用程序线程上调用getText()
<正在后台线程上调用code>doInBackground()
在执行任务之前,从
EditText
中获取值,并将其提供给AsyncTask
(例如,通过构造函数)。在onCreate
或AsyncTask
之前的某个地方调用所有getText()
函数,并将返回值分配给公共值。所以你可以联系到他们
public String MyeMail;
public String MyMDP;
onCreate()...
{
MyeMail= EmailEditText.getText().toString();
MyMDP = MdpEditText.getText().toString()
.
.
.
}
它不必在onCreate
中,但必须在用户输入EditText
字段之后。您可以在单击按钮后执行这些操作。无论如何,现在在AsyncTask的doInBackground
:
protected String doInBackground(String... params) {
int success = 0;
String result = "";
JSONObject json ;
WebCalls webCalls = new WebCalls();
JSONObject jsonUser;
User tempUser ;
if (isFieldsEmpty(EmailEditText.getText().toString(),MdpEditText.getText().toString())){
result = "Empty_Field";
return result ;
}else if (!isEmailValid(EmailEditText.getText().toString().trim())){
result = "Wrong_mail";
return result ;
}
return null;
}
doInBackground...
{
if (isFieldsEmpty(MyeMail,)) {
result = "Empty_Field";
return result ;
.
.
.
}
所以希望它能帮上忙!让我知道它是否有效。在
onCreate
或AsyncTask
之前的某个地方调用所有getText()
函数,并将返回值分配给公共值。所以你可以联系到他们
public String MyeMail;
public String MyMDP;
onCreate()...
{
MyeMail= EmailEditText.getText().toString();
MyMDP = MdpEditText.getText().toString()
.
.
.
}
它不必在onCreate
中,但必须在用户输入EditText
字段之后。您可以在单击按钮后执行这些操作。无论如何,现在在AsyncTask的doInBackground
:
protected String doInBackground(String... params) {
int success = 0;
String result = "";
JSONObject json ;
WebCalls webCalls = new WebCalls();
JSONObject jsonUser;
User tempUser ;
if (isFieldsEmpty(EmailEditText.getText().toString(),MdpEditText.getText().toString())){
result = "Empty_Field";
return result ;
}else if (!isEmailValid(EmailEditText.getText().toString().trim())){
result = "Wrong_mail";
return result ;
}
return null;
}
doInBackground...
{
if (isFieldsEmpty(MyeMail,)) {
result = "Empty_Field";
return result ;
.
.
.
}
所以希望它能帮上忙!让我知道它是否有效。异步任务的
doInBackground()
始终在非UI工作线程中运行,这意味着您无法在doInBackground()
中访问诸如EditText
、TextView
之类的UI元素。因此,如果您想在doInBackground()
中访问它们,那么您可以在AsyncTask的构造函数中传递它们并使用它们,或者最好的方法是将EmailEditText.getText().toString()
和MdpEditText.getText().toString()
作为execute()中的参数传递
异步任务的方法。
因此,假设您的AsyncTask
名称为“ProcessTask
”,那么在启动AsyncTask
时,写下以下内容:
new ProcessTask().execute(EmailEditText.getText().toString(), MdpEditText.getText().toString());
在这种情况下,您的AsyncTask应该更改为:
class ProcessTask extends AsyncTask<String,Void,Void >{
@Override
protected File doInBackground(String... params) {
String emailEditText = params[0];
String mdpEditText = params[1];
int success = 0;
String result = "";
JSONObject json ;
WebCalls webCalls = new WebCalls();
JSONObject jsonUser;
User tempUser ;
if (isFieldsEmpty(emailEditText,mdpEditText)){
result = "Empty_Field";
return result ;
}else if (!isEmailValid(emailEditText.trim())){
result = "Wrong_mail";
return result ;
}
return null;
}
类ProcessTask扩展了AsyncTask{
@凌驾
受保护的文件doInBackground(字符串…参数){
字符串emailEditText=params[0];
字符串mdpEditText=params[1];
int成功=0;
字符串结果=”;
JSONObject json;
WebCalls WebCalls=新的WebCalls();
JSONObject jsonUser;
用户临时用户;
if(isFieldsEmpty(emailEditText,mdpEditText)){
结果=“空字段”;
返回结果;
}如果(!isEmailValid(emailEditText.trim()),则为else{
结果=“错误的邮件”;
返回结果;
}
返回null;
}
AsyncTask的doInBackground()
始终在非UI工作线程中运行,这意味着您无法访问EditText
,TextView
中的等UI元素
,然后您可以将它们传递到AsyncTask的构造函数中并使用它们,或者最好的方法是将EmailEditText.getText().toString()
和MdpEditText.getText().toString()作为AsyncTask
的execute()
方法中的参数传递。
因此,假设您的AsyncTask
名称为“ProcessTask
”,那么在启动AsyncTask
时,写下以下内容:
new ProcessTask().execute(EmailEditText.getText().toString(), MdpEditText.getText().toString());
在这种情况下,您的AsyncTask应该更改为:
class ProcessTask extends AsyncTask<String,Void,Void >{
@Override
protected File doInBackground(String... params) {
String emailEditText = params[0];
String mdpEditText = params[1];
int success = 0;
String result = "";
JSONObject json ;
WebCalls webCalls = new WebCalls();
JSONObject jsonUser;
User tempUser ;
if (isFieldsEmpty(emailEditText,mdpEditText)){
result = "Empty_Field";
return result ;
}else if (!isEmailValid(emailEditText.trim())){
result = "Wrong_mail";
return result ;
}
return null;
}
类ProcessTask扩展了AsyncTask{
@凌驾
受保护的文件doInBackground(字符串…参数){
字符串emailEditText=params[0];
字符串mdpEditText=params[1];
int成功=0;
字符串结果=”;
JSONObject json;
WebCalls WebCalls=新的WebCalls();
JSONObject jsonUser;
用户临时用户;
if(isFieldsEmpty(emailEditText,mdpEditText)){
结果=“空字段”;
返回结果;
}如果(!isEmailValid(emailEditText.trim()),则为else{
结果=“错误的邮件”;
返回结果;
}
返回null;
}
您的错误在于方法doInBackground()
您正在调用两个对象EmailEditText和MdpEditText,它们是另一个线程中UI线程的一部分。
因此,要求您从UI线程调用“EmailEditText.getText().toString()”
你想做的并不是从你发布的片段中完全清楚
但这个例子可能会有所帮助:
在OnCreate()中,有如下内容
protected void onCreate(Bundle savedInstanceState) {
...
String parameters= new String[2];//make this global if you aren't calling your AsyncTask in onCreate()
parameters[1]=EmailEditText.getText().toString();
parameters[2]=MdpEditText.getText().toString();
...
}
并按如下方式调用您的AsyncTask:
new YourTask().execute(parameters);
private class YourTask extends AsyncTask<String, Void, String> {
...
@Override
protected String doInBackground(String... params) {
String email = params[0];
String mdp= params[1];
int success = 0;
String result = "";
JSONObject json ;
WebCalls webCalls = new WebCalls();
JSONObject jsonUser;
User tempUser ;
if (isFieldsEmpty(email,mdp)){
result = "Empty_Field";
return result ;
}else if (!isEmailValid(email.trim())){
result = "Wrong_mail";
return result ;
}
return null;
}
...
}
而异步任务的声明如下所示:
new YourTask().execute(parameters);
private class YourTask extends AsyncTask<String, Void, String> {
...
@Override
protected String doInBackground(String... params) {
String email = params[0];
String mdp= params[1];
int success = 0;
String result = "";
JSONObject json ;
WebCalls webCalls = new WebCalls();
JSONObject jsonUser;
User tempUser ;
if (isFieldsEmpty(email,mdp)){
result = "Empty_Field";
return result ;
}else if (!isEmailValid(email.trim())){
result = "Wrong_mail";
return result ;
}
return null;
}
...
}
YourTask扩展AsyncTask的私有类{
...
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串email=params[0];
字符串mdp=params[1];
int成功=0;
字符串结果=”;
JSONObject json;
WebCalls WebCalls=新的WebCalls();
JSONObject jsonUser;
用户临时用户;
if(isFieldsEmpty(电子邮件,mdp)){
结果=“空字段”;
返回结果;
}如果(!isEmailValid(email.trim())),则为else{
结果=“错误的邮件”;
返回结果;
}
返回null;
}
...
}
希望这有帮助!!您的错误在于方法doInBackground()
您正在调用2个对象EmailEditText和MdpEditText,它们是UI线程i的一部分