2017-12-01 10 views
0

コールバックをOkHttpから受け取った後に、uiアクションを実行すると、これはexceptionになります。コールバック後にOkHttpディスパッチャーで致命的な例外を回避する方法

致命的な例外:OkHttpディスパッチャ プロセス:org.example.verificationserviceexample、PID:20421 android.util.AndroidRuntimeException:アニメーターのみValueAnimator(android.animation.ValueAnimator.cancelで ルーパースレッド上で実行されてもよいです。 Java:1020) android.animation.AnimatorSet.cancel(AnimatorSet.java:366) (android.graphics.drawable.RippleComponent.cancelSoftwareAnimations(RippleComponent.java:214) android.graphics.drawable.RippleComponent.cancel RippleComponent.java:133)android.graphics.drawable.RippleDrawable.setBackgroundActive(RippleDrawable.java:100)の は、android.graphics.drawable.RippleComponent.enterので、android.graphics.drawable.RippleDrawable.treeBackgroundEnter(RippleDrawable.java:552)の にあります。 java:290) android.graphics.drawable.RippleDrawable.onStateChange(RippleDrawable.java:270) (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)(VerificationService.java:57) at com.bssys.spitchmobilesdk.VerificationService.stopEnrollment 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(スレッド。Javaの:761)

そして、これは私が使用しているコードです:

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パイプを使用しています!

答えて

4

OKHTTPコールバックを含む他のスレッドからビューの状態を変更しないでください。必要な場合は、runOnUiThreadブロックで行います。 setEnabledを呼び出すと、そのスレッドでは実行できないさまざまなUI関数が呼び出されます。

+0

あなたは完全に正しいです!私はその問題に悩まされ、OkHttpがAndroidライブラリではなくJavaライブラリであることを完全に忘れてしまった。ご協力いただきありがとうございます!! – miibpa

関連する問題