2016-11-27 2 views
0

와 내가 으로 멀티 스레딩 작업을 시작하고 내가 질문 here안드로이드 멀티 스레딩은 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(); 
    } 

스택 트레이스

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

그래서 그냥 예외를 알려줍니다 무엇 :

당신은 Theme.AppCompat를 사용할 필요가있는 경우, 당신은 onPreExecute()와 onPostExecute() 메서드, 같은 사용해야합니다 이 활동과 관련된 주제 (또는 자손).

편집 : 당신은에 AlertDialog.Builder에 ApplicationContext를 전달하는

() 생성자입니다. 빌더는 해당 컨텍스트에서 테마를 얻으려고 시도하며 Activity가 아닌 ApplicationContext이기 때문에 Theme.AppCompat 또는 자손이 아닌 것으로 보이는 응용 프로그램 자체의 테마를 취합니다.

많은 코드로 다시 작성하지 않으면 this resp를 전달하면 정상적으로 작동합니다. (AyncTask 내에서 호출 할 때) RegisterActivity.this ~ alertDialog()을 사용할 컨텍스트로 지정하십시오.

+0

manifest.xml에서 'android : theme = "@ style/Theme.AppCompat">'하고 동일한 결과를 얻었습니다. , 에러는'alertDialog' 함수의'.show()'를 가리키고 있습니다. – styx

+0

제가 문제를 발견했다고 생각합니다 - 제 편집 된 답변을보십시오. – Ridcully

+0

바보 같은 실수를 저도 고치십시오. – styx

0

당신이 배경 Thread에서 Dialog를 표시하려고하기 때문에 당신은 아마 Exception을 얻고있다. 이메일이 onPreExecute() 내에서 유효한지 확인하고 UI가 Thread에서 실행되므로 대화 상자가 표시되지 않는지 확인해야합니다.

+0

'onPreExecute()'가 작동하지 않아 바로 거기에'예외 '를 얻는 이유가 있지만 해결 방법을 모릅니다. – styx

+0

"작동하지 않음"이 무슨 뜻인지 몰라요. 더 자세하게 얘기해 주 시겠어요? – Emmanuel

+0

'java.lang.IllegalStateException :이 액티비티와 함께 ​​Theme.AppCompat 테마 (또는 자손)를 사용해야합니다. ' – styx

0

편집 : 활동이 AppCompatActivity를 확장하고 있으며 표준 동작 대신에 android.support.v7.app.AlertDialog를 가져 오는지 확인하십시오. 그런 다음 AsyncTask를 다음과 같이 변경하십시오.

doInBackground() 메소드는 장기 실행 작업을 수행 할 수 있지만 UI와 상호 작용할 수는 없습니다.

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 : 당신은 테마를 사용해야합니다.com.example.ofir.bopofinal.LoginRegister.LoginActivity.alertDialog (LoginActivity.java:53)' – styx

+0

@styx - 충돌의 스택 추적을 게시하십시오.이 활동이있는 AppCompat 테마 (또는 자손). rhari의 대답은 개념적으로 정확합니다. 아마 충돌의 이유는 뭔가 다른 것입니다. – Ridcully

+0

@rhari 내 응용 프로그램이 이미 AppCompatActivity를 확장하고 importing android.support.v7.app.AlertDialog 가져 오기 – styx