2016-11-27 3 views
0

я начал работать с Многопоточностью, как и я хотел пойти проверки пользовательского ввода, так что я посмотрел на вопросе hereAndroid MultiThreading с afterTextChanged

, но все еще с какой-то причины моих приложения разбились, и я не могу точно определить, к проблема

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

StackTrace

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) 

ответ

0

Так, просто делать то, что говорит вам Exception:

Вы должны использовать Theme.AppCompat тема (или потомок) с этой деятельностью.

EDIT:

Вы пропусканием ApplicationContext в AlertDialog.Builder) конструктор (. Строитель пытается получить свою тему из этого контекста, и поскольку это ApplicationContext, а не Activity, он займет тему самого приложения, которое, похоже, не является Theme.AppCompat или потомком.

Не переписывая большую часть своего кода, он должен работать, если вы пройдете this resp. (при вызове из AyncTask) RegisterActivity.this - alertDialog() в качестве контекста для использования.

+0

Я сделал 'android: theme =" @ style/Theme.AppCompat ">' в manifest.xml и im, получая тот же результат , ошибка указывает на '.show()' в функции 'alertDialog' – styx

+0

Я думаю, что нашел проблему - см. мой отредактированный ответ. – Ridcully

+0

спасибо, такая глупая ошибка – styx

0

Вы, вероятно, получать Exception, потому что вы пытаетесь отобразить Dialog от фона Thread. Вы должны проверить, действительно ли электронная почта действительна внутри onPreExecute(), и если она не отображает диалоговое окно, то с момента его запуска на UI Thread.

+0

'onPreExecute()' не работает, и вы правы, поэтому я получаю «Исключение», но я не знаю, как его решить. – styx

+0

Я не знаю, что вы подразумеваете под «не работает». Можете быть более конкретными? – Emmanuel

+0

'java.lang.IllegalStateException: вам нужно использовать тему Theme.ppCompat (или потомка) с этим действием.' – styx

0

Редактировать: Убедитесь, что ваша активность расширяет AppCompatActivity, и вы импортируете файл android.support.v7.app.AlertDialog вместо стандартного. Затем измените AsyncTask следующим образом:

Метод doInBackground() может выполнять длительные операции, но не может взаимодействовать с пользовательским интерфейсом. Для этого следует использовать 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(); 
+0

получить ту же самую ошибку java.lang.IllegalStateException: вам нужно использовать тему.Тема AppCompat (или потомок) с этим действием. 'At' com.example.ofir.bopofinal.LoginRegister.LoginActivity.alertDialog (LoginActivity.java:53) ' – styx

+0

@styx - пожалуйста, разместите stacktrace вашего сбоя. Ответ рири кажется правильным, концептуальным. Возможно, причина аварии - это нечто иное. – Ridcully

+0

@rhari мое приложение уже расширяет AppCompatActivity и импортирует файл android.support.v7.app.AlertDialog – styx

Смежные вопросы