如何在回调后避免OkHttp Dispatcher中的FATAL EXCEPTION

mii*_*bpa 3 android okhttp

exception在接收到回调后执行ui动作时我得到了这个OkHttp.

致命异常:OkHttp Dispatcher进程:org.example.verificationserviceexample,PID:20421 android.util.AndroidRuntimeException:动画师只能在android.animation的android.animation.ValueAnimator.cancel(ValueAnimator.java:1020)的Looper线程上运行. AnimatorSet.cancel(AnimatorSet.java:366)在android.graphics.drawable.RippleComponent.cancelSoftwareAnimations(RippleComponent.java:214)在android.graphics.drawable.RippleComponent.cancel(RippleComponent.java:133)在android.graphics.drawable .RippleComponent.enter(RippleComponent.java:100)在android.graphics.drawable.RippleDrawable.tryBackgroundEnter(RippleDrawable.java:552)在android.graphics.drawable.RippleDrawable.setBackgroundActive(RippleDrawable.java:290)在android.graphics.在Android.widget.TextView的android.view.View.drawableStateChanged(View.java:18046)的android.graphics.drawable.Drawable.setState(Drawable.java:735)中的drawable.RippleDrawable.onStateChange(RippleDrawable.java:270) .drawableStateChanged(TextView.j ava:4090)位于android.view.View.setEnabled(View.java)的android.view.View.refreshDrawableState(View.java:18115)的android.support.v7.widget.AppCompatButton.drawableStateChanged(AppCompatButton.java:155) :8135)在android.widget.TextView.setEnabled(TextView.java:1609)在org.example.verificationserviceexample.MainActivity.renderButtons(MainActivity.java:146)在org.example.verificationserviceexample.MainActivity.onAudioStateChanged(MainActivity.java: 170)在com.bssys.spitchmobilesdk.audio.SpitchAudioManager.publishAudioStateChange(SpitchAudioManager.java:123)在com.bssys.spitchmobilesdk.audio.SpitchAudioManager.stopAudio(SpitchAudioManager.java:83)在com.bssys.spitchmobilesdk.VerificationService.stopAudio (VerificationService.java:96)位于org.example的org.example.verificationserviceexample.MainActivity.lambda $ null $ 0 $ MainActivity(MainActivity.java:60)的com.bssys.spitchmobilesdk.VerificationService.stopEnrollment(VerificationService.java:57) .verificationserviceexample.MainActivity $$林 BDA $ 3.onSpitchResult(来源不明)在com.bssys.spitchmobilesdk.VerificationService $ 1.onFailure(VerificationService.java:111)在okhttp3.RealCall $ AsyncCall.execute(RealCall.java:161)在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.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);

    }
Run Code Online (Sandbox Code Playgroud)

我正在使用OkIo Pipe来为RequestBody填充音频数据

提前致谢!

Gab*_*han 7

不要更改其他线程的视图状态,包括OKHTTP回调.如果需要,请在runOnUiThread块上执行此操作.通过调用setEnabled,您将导致调用无法在该线程上运行的各种UI函数.