【问题标题】:How to avoid FATAL EXCEPTION in OkHttp Dispatcher after callback回调后如何避免 OkHttp Dispatcher 中的 FATAL EXCEPTION
【发布时间】:2018-05-15 20:40:29
【问题描述】:

在收到来自OkHttp 的回调后执行 ui 操作时,我收到此 exception

致命异常:OkHttp 调度程序 进程:org.example.verificationserviceexample,PID:20421 android.util.AndroidRuntimeException:动画器只能在 Looper 线程上运行 在 android.animation.ValueAnimator.cancel(ValueAnimator.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.RippleComponent.enter(RippleComponent.java:100) 在 android.graphics.drawable.RippleDrawable.tryBackgroundEnter(RippleDrawable.java:552) 在 android.graphics.drawable.RippleDrawable.setBackgroundActive(RippleDrawable.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.widget.TextView.drawableStateChanged(TextView.java:4090) 在 android.support.v7.widget.AppCompatButton.drawableStateChanged(AppCompatButton.java:155) 在 android.view.View.refreshDrawableState(View.java:18115) 在 android.view.View.setEnabled(View.java: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) 在 com.bssys.spitchmobilesdk.VerificationService.stopEnrollment(VerificationService.java:57) 在 org.example.verificationserviceexample.MainActivity.lambda$null$0$MainActivity(MainActivity.java:60) 在 org.example.verificationserviceexample.MainActivity$$Lambda$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);

    }

我正在使用 OkIo 管道用音频数据填充 RequestBody

提前致谢!

【问题讨论】:

    标签: android okhttp


    【解决方案1】:

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

    【讨论】:

    • 你完全正确!我被这个问题困住了,完全忘记了 OkHttp 是一个 Java 库而不是 Android 库。谢谢你的帮助!!
    【解决方案2】:

    请在下面的代码中添加你的 build.gradle(:app) 文件:

     compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    

    【讨论】:

    • 对不起,但这不能解决这个错误,正确的答案是接受的;)
    猜你喜欢
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多