主线程上的 Okhttp 响应回调

2024-01-23

我创建了一个帮助程序类来处理我的应用程序中的所有 http 调用。它是 okhttp 的一个简单的单例包装器,如下所示(我省略了一些不重要的部分):

public class HttpUtil {

    private OkHttpClient client;
    private Request.Builder builder;

    ...

    public void get(String url, HttpCallback cb) {
        call("GET", url, cb);
    }

    public void post(String url, HttpCallback cb) {
        call("POST", url, cb);
    }

    private void call(String method, String url, final HttpCallback cb) {
        Request request = builder.url(url).method(method, method.equals("GET") ? null : new RequestBody() {
            // don't care much about request body
            @Override
            public MediaType contentType() {
                return null;
            }

            @Override
            public void writeTo(BufferedSink sink) throws IOException {

            }
        }).build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, Throwable throwable) {
                cb.onFailure(null, throwable);
            }

            @Override
            public void onResponse(Response response) throws IOException {
                if (!response.isSuccessful()) {
                    cb.onFailure(response, null);
                    return;
                }
                cb.onSuccess(response);
            }
        });
    }


    public interface HttpCallback  {

        /**
         * called when the server response was not 2xx or when an exception was thrown in the process
         * @param response - in case of server error (4xx, 5xx) this contains the server response
         *                 in case of IO exception this is null
         * @param throwable - contains the exception. in case of server error (4xx, 5xx) this is null
         */
        public void onFailure(Response response, Throwable throwable);

        /**
         * contains the server response
         * @param response
         */
        public void onSuccess(Response response);
    }

}

然后,在我的主要活动中,我使用这个辅助类:

HttpUtil.get(url, new HttpUtil.HttpCallback() {
            @Override
            public void onFailure(Response response, Throwable throwable) {
                // handle failure
            }

            @Override
            public void onSuccess(Response response) {
                // <-------- Do some view manipulation here
            }
        });

onSuccess代码运行时抛出异常:

android.view.ViewRootImpl$CalledFromWrongThreadException:仅 创建视图层次结构的原始线程可以触摸其视图。

根据我的理解,Okhttp 回调在主线程上运行,那么为什么我会收到此错误?

** 作为旁注,我创建了HttpCallback包装 Okhttp 的接口Callback类因为我想改变的行为onResponse and onFailure这样我就可以统一处理由于 i/o 异常导致的失败响应和由于服务器问题导致的失败响应的逻辑。

Thanks.


根据我的理解,Okhttp 回调在主线程上运行,那么为什么我会收到此错误?

这不是真的。回调在后台线程上运行。如果您想立即处理 UI 中的某些内容,您将需要发布到主线程。

由于您已经有一个回调包装器,您可以在助手内部执行此操作,以便所有HttpCallback为了方便起见,在主线程上调用方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

主线程上的 Okhttp 响应回调 的相关文章

  • Android 通知栏和标题栏的大小?

    android 有没有办法获取通知栏和标题栏的大小 目前我通过以下方式获取显示宽度和高度 Display display getWindowManager getDefaultDisplay int width display getWid
  • 如何取消/取消订阅协程 Flow

    当我尝试提前取消流程时 我注意到一个奇怪的行为 看一下下面的例子 这是一个发出整数值的简单流程 private fun createFlow flow repeat 10000 emit it 然后我打电话给createFlow使用此代码的
  • android中如何释放内存避免内存泄漏

    While going through the android developer site i found this 它说为了避免内存泄漏 我们应该在 onStop 中释放资源 但如何做到这一点 基本上 任何被正确清空的对象都被视为已释放
  • Android Fragment 可以覆盖 PhoneGap Activity 吗?

    下图应代表以蓝色标记的 PhoneGap Cordova 应用程序 红色区域应该是一个Android Fragment 是否可以有一个覆盖 PhoneGap Activity 的 Android Fragment 编辑 覆盖的 Androi
  • 我究竟做错了什么? (多线程)

    简而言之 这就是我正在做的事情 在我班级的 cpp 文件中 我有 std vector
  • 如何获取拍摄照片的uri?

    我想实现什么目标 我想获取捕获图像的 URI 并将其保存在 Firebase 上 我尝试了什么 首先我需要打开相机 下面我是如何做到的 Intent cameraIntent new Intent android provider Medi
  • 如何在Android上创建原生C++库?

    我需要用C 编写一个动态链接库 供Android上的Java使用 据我所知 它应该是 so 库 但我不知道该怎么做 我尝试了 Cygwin 但它崩溃了 海湾合作委员会1 cpp usr lib gcc i686 pc cygwin 4 3
  • 如何使用意图将哈希图值发送到另一个活动

    如何发送HashMap从一个意图到第二个意图的价值 另外 如何检索HashMap第二个活动的价值 Java 的 HashMap 类扩展了Serializable接口 这使得可以轻松地将其添加到意图中 使用Intent putExtra St
  • 颜色资源 ID 返回错误值

    我试图在 onCreate 期间以编程方式从颜色资源设置文本颜色 但得到了一些奇怪的结果 我在 res colors xml 中定义了一个颜色资源
  • 如何隐藏 Android Spinner 中的一项

    我正在寻找一种方法来隐藏 Android 旋转小部件中的一个项目 这将允许您模拟没有选择任何项目的微调器 并确保始终为每个选择的项目调用 onItemSelected 回调 如果隐藏项目是 当前 项目 通常 微调器中始终有一项不会生成回调
  • 在手机上单步执行 Android 代码 - 大行号差异

    我正在尝试调试与 Samsung Captivate Galaxy S 上的 ListView 相关的一些代码 我在代码中的某个位置放置了断点 当它停止时 我会在堆栈上返回几帧到 ListView 源 现在 我可以预期会出现一些不匹配的情况
  • 使用 Eclipse 测试 PhoneGap 应用程序时不断收到“发生网络错误”

    我刚刚收到分包商提供的 PhoneGap 解决方案 以便在发布前在我的手机上进行测试 我将项目导入到 Eclipse 中 一切看起来都很好 我可以通过打开 index html 文件在我的计算机上本地测试该应用程序 file E AppDe
  • Gradle 从服务器收到状态代码 403:禁止

    由于这个错误 我无法构建我的 android 项目 Gradle 无法获取https www jitpack io com github Raizlabs DBFlow dbflow 3 1 1 dbflow 3 1 1 pom https
  • Firebase API 密钥限制不适用于 Android 应用程序包名称和 SHA1 指纹

    我们正在使用 Google Firebase 获取我们应用程序的 CrashLytics 数据 以及通过google services json文件被提出作为一个安全问题 因为应用程序 apk 文件可以被逆向工程来获取该文件 然后攻击者可以
  • 以编程方式列出意图过滤器

    在 android Activity 中 有没有一种方法可以以编程方式列出它已注册的活动
  • 在 SQLite 中加密数据

    如何加密我的数据 就我研究的解决方案而言 有两种方法 使用android提供的算法加密数据 我使用android提供的 Cipher 来加密我的数据 但我在检索大量记录的数据时遇到问题 导致应用程序的性能显着降低 我对整个数据库进行了编码
  • Gradle:找不到受信任的证书

    我正在尝试使用 Gradle 在 Ubuntu 服务器上构建我的 Android 项目 在我的 Windows 10 PC 上使用 Android Studio 构建工作正常 但使用 gradlew build or gradlew cle
  • 如何调整图像大小而不模糊,或使用毕加索

    我需要帮助来改进我的代码 我在做什么 主活动中有一个按钮 单击时 用户选择图像 之后 图像通过意图传递到另一个活动 add image java 并显示在图像视图中 之后我将图像发送到服务器 我的问题 1 我想要将路径图像发送到第二个意图然
  • 如何在声音输入时触发振动?

    我正在尝试创建一个 Android 应用程序 在其中过滤蜂鸣声的一个特定频率并使手机振动 我正在从移动设备的 MIC 获取输入并使用 MediaRecorder 类 通过使用该类 我可以录制 保存和播放输入 现在我需要我的手机在发出蜂鸣声
  • 构建 AOSP 5.1 时出现 API 更改错误

    目前正在尝试构建 android 5 1 0 r5 我已经检查了来源并且没有做任何修改 但是 编译时出现以下错误 Checking API checkpublicapi current out target common obj PACKA

随机推荐

  • addTooltip 间歇性地使用observeEvent 中的两个输入

    我正在构建一个闪亮的应用程序来绘制网络 用户可以选择一个节点 单击切换按钮以显示该节点的自我网络 然后单击相同的按钮返回主网络 我试图获得一个工具提示 将鼠标悬停在按钮上 其中的文本会根据按钮本身的状态以及是否选择节点而变化 问题是工具提示
  • Google Apps 脚本:一天内调用服务次数过多:电子邮件

    我正在尝试循环浏览电子表格 并为每一行发送一封电子邮件 电子邮件发送后 我想删除该行 然而那是行不通的 由于某种原因 它开始疯狂地发送电子邮件 并在某个时候达到限制并退出 它实际上只删除一行 请参阅下面的代码 function sendEm
  • Fortran 与 C++ 相比,如今 Fortran 在数值分析方面是否仍然具有优势? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 随着C 编译器 尤其是intel编译器 的快速发展 以及在C C 代码中直接应用SIMD函数的能力 Fortran在数值计算领域是否仍然具有真正
  • 如何在 App.config 中设置 SQLCommandTimeout

    我已经使用 SQL 数据库开发了一个 Window 服务 目前我的数据库中充满了记录 因此查询执行需要很长时间 而默认命令超时为 30S 但我想将其增加到 120S 一个选项是 com CommandTimeout 120 但我的应用程序中
  • Java 方法中的动态返回类型

    我在这里多次看到类似的问题 但有一个很大的区别 在其他问题中 返回类型由参数确定 我想要 需要做的是通过解析的值确定返回类型byte 根据我收集的信息 以下方法可能有效 public Comparable getParam String p
  • 为什么 _mm_stream_ps 会产生 L1/LL 缓存未命中?

    我正在尝试优化计算密集型算法 但遇到了一些缓存问题 我有一个巨大的缓冲区 它偶尔会随机写入 并且在应用程序结束时只读取一次 显然 写入缓冲区会产生大量缓存未命中 并且还会污染随后再次需要进行计算的缓存 我尝试使用非时间移动内在函数 但缓存未
  • Chrome 中页面加载时的 Popstate

    我正在为我的网络应用程序使用 History API 但遇到一个问题 我执行 Ajax 调用来更新页面上的一些结果并使用history pushState 为了更新浏览器的地址栏而不重新加载页面 然后 当然 我用window popstat
  • Javascript / jQuery - 点击 iPhone 上的元素外部

    我在这个问题中找到了一个关于检测 div 外部点击的很好的答案 如何检测元素外部的点击 https stackoverflow com questions 152975 how to detect a click outside an el
  • 使用之间的区别?和 :prepare 语句中的参数

    假设我想选择记录Id 30 准备好的语句允许两种绑定参数的方式 问号 id 30 q conn gt prepare SELECT FROM pdo db WHERE id gt q gt execute array id Here abo
  • 子div比父div大

    计划是使子 div 与父 div 中的空间一样大 是否可以选择将父级 div 的完整高度应用到子元素上 我只知道 css calc 作为一个选项 但我不想实现这个选项 另外我在图像中解释了这个问题 parent height 250px w
  • Firefox 配置文件首选项 vs Chrome 选项 vs IE 所需功能

    我已经看到 并且实际上回答了 几个特定于硒的问题 其中需要设置一些特定的浏览器首选项来更改其行为 例如 如何使用 Selenium 处理证书 https stackoverflow com questions 24507078 how to
  • Django - 生产中的内存中的sqlite

    我有一个在生产中使用的小型 10MB 只读 sqlite3 数据库 我想加快我的网站速度 因此我尝试在每次 Django 启动时将整个数据库从磁盘加载到内存 这个答案解释了如何在烧瓶中做到这一点 https stackoverflow co
  • 如何创建全局枚举

    如何通过所有类访问枚举 让我解释 enum BottomBackButtonNav 0 BottomNextButtonNav BottomSliderIncreaseNav BottomSliderDcreaseNav PageSwipe
  • 量角器新手,收集选择选项有困难

    自学量角器和解决非角度网络应用程序的问题 并从选择控件中获取所有值的列表 这是 html 但似乎无法验证列表 本网站的第一个重量选择框 http halls md body surface area bsa htm http halls m
  • 在 Python 中定义异常的“正确”方法,PyLint 不会抱怨

    我试图在 Python 2 6 中定义我自己的 非常简单的 异常类 但无论我怎么做 我都会收到一些警告 首先 最简单的方法 class MyException Exception pass 这有效 但在运行时打印出警告 Deprecatio
  • 如何从图像中检测机器人方向?

    我正在开发可以在玉米植株中运行并由罗盘传感器引导的机器人 但我想将相机用作机器人的眼睛 并使用图像处理来检测运动的误差角度 这是图像示例 processed image raw image segmented image 我使用以下步骤 步
  • 为什么 cin 将我的双精度输入转换为整数? C++

    我有以下代码 int variable 1 variable 2 cout lt lt Please enter the 2 numbers try if cin gt gt variable 1 throw Invalid number
  • CriteriaBuilder. 和 & CriteriaBuilder.or,如何操作?

    我正在尝试更改以下 HQL 以使用 JPA Criteria select distinct d from Department d left join fetch d children c where d parent is null a
  • 如何告诉 Visual Studio 不要填充设计器代码中的字段?

    我有一个自定义控件 当我将其拖到表单上时 会创建以下 Designer cs 代码 colorPickerBackground this colorPickerBackground Color Color Empty this colorP
  • 主线程上的 Okhttp 响应回调

    我创建了一个帮助程序类来处理我的应用程序中的所有 http 调用 它是 okhttp 的一个简单的单例包装器 如下所示 我省略了一些不重要的部分 public class HttpUtil private OkHttpClient clie