2017-12-01 23 views
0

OkHttp에서 콜백을받은 후 UI 작업을 수행 할 때이 값이 exception이됩니다.콜백 후 OkHttp Dispatcher에서 치명적인 예외를 피하는 방법

치명적인 예외 : OkHttp 디스패처 프로세스 : org.example.verificationserviceexample, PID : 20421이 android.util.AndroidRuntimeException : 애니메이터는 루퍼에서 실행 할 수는 ValueAnimator (android.animation.ValueAnimator.cancel에서 스레드. 자바 : 1020) android.animation.AnimatorSet.cancel (AnimatorSet.java:366) 에서 android.graphics.drawable.RippleComponent.cancelSoftwareAnimations에서 android.graphics.drawable.RippleComponent.cancel에서 (RippleComponent.java:214) (RippleComponent.java:133) android.graphics.drawable.RippleComponent.enter (RippleComponent.java:100) android.graphics.drawable.RippleDrawable.tryBackgroundEnter (0126) 자바 : android.graphics.drawable.RippleDrawable.onStateChange (RippleDrawable.java:270에서 290) ) android.graphics.drawable.Drawable.setState (Drawable.java:735에서 ) android.view.View.drawableStateChanged에서 (View.java:18046) android.support.v7.widget.AppCompatButto의 에있는 android.widget.TextView.drawableStateChanged (TextView.java:4090) n.drawableStateChanged (AppCompatButton.java:155) android.view.View.refreshDrawableState (View.java:18115)에서 android.view.View.setEnabled (View.java:8135)에서 android.widget.TextView에서 . org.example.verificationserviceexample.MainActivity.renderButtons (MainActivity.java:146) com.bssys에서 org.example.verificationserviceexample.MainActivity.onAudioStateChanged (MainActivity.java:170)에서 에서 (TextView.java:1609) 는 setEnabled. spitchmobilesdk.audio.SpitchAudioManager.publishAudioStateChange (SpitchAudioManager.java:123) at com.bssys.spitchmobilesdk.audio.SpitchAudioManager.stopAudio (SpitchAudioManager.java:83)org.example.verificationserviceexample.MainActivity.lambda $ 널 (null) $ 0 com.bssys.spitchmobilesdk.VerificationService.stopEnrollment (VerificationService.java:57) 에서 com.bssys.spitchmobilesdk.VerificationService.stopAudio (VerificationService.java:96) 에서okhttp3에서 com.bssys.spitchmobilesdk.VerificationService $ 1.onFailure에서 org.example.verificationserviceexample.MainActivity $$ 람다 $ 3.onSpitchResult (알 소스) (VerificationService.java:111) 에서 $ MainActivity (MainActivity.java:60) .RealCall $ AsyncCall.execute (RealCall.java:161) at okhttp3.internal.NamedRunnable.run (NamedRunnable.java:32) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1133) 에서 java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:607) 에서 java.lang.Thread.run (Thread.자바 : 사전에 오디오 데이터와

public void addVoicePrintFromSource(Pipe source, SpitchConfig config, @NonNull String speakerId, Callback callback){ 

     RequestBody requestBody = new RequestBody() { 
      @Override 
      public MediaType contentType() { 
       return MediaType.parse("audio/x-pcm; rate="+config.getRate()); 
      } 

      @Override 
      public void writeTo(BufferedSink sink) throws IOException { 
       sink.writeAll(source.source()); 
      } 
     }; 
     Request request = new Request.Builder() 
     .url(config.getServerURL()) 
       .addHeader("Accept","*/*") 
       .addHeader("Connection","Keep-Alive") 
       .post(requestBody) 
       .build(); 

     okHttpClient.newCall(request).enqueue(callback); 

    } 

내가 RequestBody을 채우기 위해 OkIo 파이프를 사용하고

감사 : 761)

는 그리고 이것은 내가 사용하는 코드입니다!

답변

4

다른 스레드에서보기 상태를 변경하지 마십시오. 여기에는 OKHTTP 콜백이 포함됩니다. 필요한 경우 runOnUiThread 블록에서 수행하십시오. setEnabled를 호출하면 해당 스레드에서 실행할 수없는 다양한 UI 함수가 호출됩니다.

+0

당신이 완전 하군! 나는 그 문제에 집착하고 OkHttp가 자바 라이브러리이고 안드로이드 라이브러리가 아니라는 것을 완전히 잊어 버렸다. 당신의 도움을 주셔서 감사합니다!! – miibpa