多次调用 Looper 会导致“向死线程上的处理程序发送消息”

2023-12-06

我使用 Executor [固定线程池] 和我自己的 ThreadFactory 添加了 Looper:

Handler HANDLER = new Handler();
Executor    THREADS = Executors.newFixedThreadPool(THREAD_POOL_SIZE, new ThreadFactory() {
    @Override public Thread newThread(Runnable runnable) {
        return new MyThread(new Runnable() {
            @Override public void run() {
                Looper.prepare();
                runnable.run();
            }
        });
    }
});

private static class MyHandler extends Handler {
    public boolean fail;
        public void handleMessage(Message msg) {
        switch(msg.what) {
            case 1:
                this.fail = msg.arg1 == 1;
                Looper.myLooper().quit();
                break;
            }
        }
    }
}

我正在运行一个发出网络请求的线程,但如果网络失败,我希望向用户显示一条对话框消息。这个过程相当复杂,因为它需要在 UI 线程中发出并显示请求。我可以通过简单地向网络线程添加一个循环并等待从 UI 线程发送消息来等待用户对对话框的响应。这允许我将网络请求封装在 while(tryAgain) 线程中。一切正常,除非第二次调用 Looper.loop() 方法(显示第二个网络错误对话框后)并且对话框(在 UI 线程中)向网络线程的处理程序发送一条消息:

THREADS.execute(new Runnable() {
    private MyHandler   myHandler   = new MyHandler();
    @Override public void run() {
        boolean tryAgain    = true;
        while(tryAgain) {
            try {
                switch(request) {
                    [Handle network requests]
                }
                tryAgain    = false;

            } catch(IOException e) {
                // The network is unavailable.  Ask the user if we should try again.
                e.printStackTrace();

            } finally {
                if(tryAgain) {
                    HANDLER.post(new Runnable() {   // The UI thread
                        @Override public void run() {
                            theAlertDialog.show();
                        }
                    });

                    // Wait for the results from the dialog which lives in the UI thread.
                    Looper.loop();

                    // At this point the dialog has informed us of our answer.
                    tryAgain = !myHandler.fail;
                }
            }
        }
    }
});

在AlertDialog实例中是一个OnClickListener:

DialogInterface.OnClickListener myOnclickListener = new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int id) {
        Message msg = myHandler.obtainMessage(1);
        msg.setTarget(this.handler);
        msg.sendToTarget();
    }
}

我已经检查过该线程仍然处于活动状态handler.getLooper().getThread().isAlive()它总是返回 true,但它仍然给我“向死线程上的处理程序发送消息”。消息/处理程序如何确定线程已死亡?它不应该依赖 .isAlive() 方法吗?最后,我试图避免将线程管理构建复制到 Android 操作系统中:-)


如果您检查 android/os/MessageQueue.java 中的源代码,您可以看到类似以下内容

  if (mQuiting) {
                RuntimeException e = new RuntimeException(
                    msg.target + " sending message to a Handler on a dead thread");
                Log.w("MessageQueue", e.getMessage(), e);
                return false;
            } else if (msg.target == null) {
                mQuiting = true;
            }
   }

所以在第一次调用 Looper.quit() 后,消息队列基本上无法使用,因为它入队的 Message 目标为空,这是消息队列停止入队并出现“死亡”的神奇标识符。

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

多次调用 Looper 会导致“向死线程上的处理程序发送消息” 的相关文章

  • 如何清除所有WebView存储的信息?

    我有一个 Android 浏览器 我可以选择清除缓存 存储 cookie 等 代码如下所示 webView clearCache true webView clearFormData webView clearHistory webView
  • Sqlite数据库生命周期?关闭应用程序后它会被删除吗?

    我正在遵循一个简单的教程 该教程创建一个从 SQLiteOpenHelper 扩展的类 并创建一个包含一个表和 5 行的数据库 好的 但我需要更多地了解 android Sqlite 数据库 例如 如果应用程序关闭或手机关机会发生什么 数据
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • CardView 圆角获得意想不到的白色

    When using rounded corner in CardView shows a white border in rounded area which is mostly visible in dark environment F
  • 无法获取log.d或输出Robolectrict + gradle

    有没有人能够将 System out 或 Log d 跟踪从 robolectric 测试输出到 gradle 控制台 我在用Robolectric Gradle 测试插件 https github com robolectric robo
  • 找不到处理意图 com.instagram.share.ADD_TO_STORY 的活动

    在我们的 React Native 应用程序中 我们试图让用户根据视图 组件中的选择直接将特定图像共享到提要或故事 当我们尝试直接使用 com instagram share ADD TO FEED 进行共享时 它以一致的方式完美运行 但是
  • Android 模拟器插件无法初始化后端 EGL 显示

    我在 Cloudbees 上设置了 Jenkins 作业 并且可以在那里成功签出并编译我的 Android 项目 现在我想在 android 模拟器中运行一些 JUnit 测试并添加 Android 模拟器插件 我将 显示模拟器窗口 选项设
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 获取当前 android.intent.category.LAUNCHER 活动的实例

    我创建了一个库项目 并在多个应用程序之间共享 我实现了一个简单的会话过期功能 该功能将在一段时间后将用户踢回到登录屏幕 登录屏幕活动是我的主要活动 因此在清单中它看起来像这样
  • 你的CPU不支持NX

    我刚刚下载了 android studio 但是我遇到了一个问题 当我运行它时 它说你的 cpu 不支持 NX 我应该怎么办 NX 或实际上是 NX 处理器位 是处理器的一项功能 有助于保护您的 PC 免受恶意软件的攻击 当此功能未启用并且
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 在 android DatePickerDialog 中将语言设置为法语

    有什么办法可以让日期显示在DatePickerDialog用法语 我已经搜索过这个但没有找到结果 这是我的代码 Calendar c Calendar getInstance picker new DatePickerDialog Paym
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • Android Studio - Windows 7 上的 Android SDK 问题

    我对 Google i o 2013 上发布的最新开发工具 Android Studio 有疑问 我已经成功安装了该程序并且能够正常启动 我可以导入现有项目并对其进行编辑 但是 当我尝试单击 SDK 管理器图标或 AVD 管理器图标时 或者
  • Android:膨胀布局时出现 StackOverFlowError 和 InvokingTargetException

    首先 对不起我的英语 我在膨胀布局时有一个问题 我有一个自定义视图 从 LinearLayout 扩展而来 称为按钮帮助 我在名为的布局上使用该视图加载活动 我的以下代码在所有设备和模拟器上都能完美运行 但具有 QVGA 屏幕 例如 Sam
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 将两个文本视图并排放置在布局中

    我有两个文本视图 需要在布局中并排放置 并且必须遵守两条规则 Textview2 始终需要完整显示 如果布局中没有足够的空间 则必须裁剪 Textview1 例子 文本视图1 文本视图2 Teeeeeeeeeeeeeeeeeextview1
  • Crashlytics 出现 Android Studio 构建错误

    我正在尝试将 CrashLytics 与 Android Studio 和 gradle 一起使用 但出现一个令人困惑的错误 java lang NoSuchMethodError 我的 build gradle 是 buildscript

随机推荐

  • 我如何告诉 Moq 返回任务?

    我有一个接口声明 Task DoSomethingAsync 我使用 Moq 框架进行测试 TestMethod public async Task MyAsyncTest Mock
  • 如何使用 JAVASCRIPT 播放和暂停嵌入的 Spotify?

    有人可以解释一下如何播放和暂停这个 Spotify 嵌入对象吗 我试图找到该玩家的 ID 但找不到 URL https open spotify com embed podcast show 5iKz9gAsyuQ1xLG6MFLtQg 这
  • 在 AVX2 中重现 _mm256_sllv_epi16 和 _mm256_sllv_epi8

    我很惊讶地看到 mm256 sllv epi16 8 m256i v1 m256i v2 and mm256 srlv epi16 8 m256i v1 m256i v2 不在英特尔内联指南我没有找到任何解决方案来仅使用 AVX2 重新创建
  • 无法在 Ubuntu 上安装 Elastic Beanstalk CLI

    我正在尝试使用以下命令在新的 Ubuntu 14 04 在适用于 Windows 的 Linux 子系统上 上安装 Elastic Beanstalk CLI awsebcli sudo pip install awsebcli 但启动eb
  • 如何从文本文件列表中的单词中删除行?

    file1 gt word list txt gt 超过 1 000 000 行 file2 gt list txt gt 超过 1 000 000 行 我有一个包含单词列表的文件 我想从一个大文本文件中删除此文件中所有单词的所有出现 Ex
  • SQLSTATE[HY093] :插入 mysql 数据库期间的 pdo 语句

    这是我实现插入数据库的php代码
  • Android XML 对象序列化

    我想在 Android 中将对象序列化为 XML 有建议的库吗 PS 已经尝试过 XStream 但它无法在 Android 上正确序列化枚举 问题在这里 Android 中枚举的序列化问题 你有没有尝试过简单的http simple so
  • 为什么 SQL Server 2012 中的变量表回滚不起作用?

    我创建了一个变量表 在我的存储过程中 有很多事务 现在 每当发生错误时 我想回滚特定事务 该事务包含一些从变量表中插入 更新或删除记录的语句 这只是我的实际问题的一个例子 declare tab table val int insert i
  • 进度条属性改变事件不触发

    我正在使用 JProgressBar 显示从 DataBase 加载的数据的进度 我正在使用 SwingWorker 类来加载后台线程中的数据Tutorial 我的应用程序的 ProgressBar 的属性更改事件没有触发 请指导我我做错了
  • PostgreSQL:count() 还是保留一个计数器?

    我有两个处于一对多关系的表 假设对于表中的每一行foo 表中可以有 0 行或多行bar引用该行foo 客户想知道有多少行bar引用一行foo 对于中的所有行foo 我可以通过以下查询来完成此操作 SELECT count bar id FR
  • 在 Matlab 中将字符串单元格转换为双精度型

    我如何转换单元格如下 gt gt A 2 2 23 23 6 A 2 2 23 23 6 为以下双倍 A 2 0000 2 0000 NaN 23 0000 23 6000 str2double可以直接在字符串元胞数组上调用 gt gt X
  • 重新检查文档的拼写是否与 VBA 代码不同

    我想在添加字典后重新检查文档中的拼写 问题是下面的代码 大部分来自宏记录器 CustomDictionaries Add FileName c test dictionary dic Application ResetIgnoreAll A
  • NoClassDefFoundError FirebaseOptions,android?

    当我在设备上运行我的应用程序时 我收到此异常 java lang NoClassDefFoundError com google firebase FirebaseOptions at com google firebase Firebas
  • 如何使用字符串联合填充对象类型的可选嵌套关系?

    我正在尝试创建一个Populate需要 2 个泛型的类型 具有可选关系的对象类型 引用其他对象类型的键 以及可以深度填充 或者更确切地说 设置为非可选 关系的 Path 字符串的联合 例如 有 3 个实体 它们都可以选择性地相互引用 typ
  • 将Actionbarsherlock导入到eclipse中

    有人可以告诉我如何正确导入 SherlockFragmentActivity java 和 ActionBarSherlock 文件夹的步骤吗 我不太确定如何做到这一点 并且在尝试时遇到很多错误 提取 ActionBarSherlock 项
  • javascript eval 可能会带来哪些问题

    我尝试谷歌搜索 但没有得到非常具体的答案 话又说回来 我可能没有使用正确的关键字 有人能指出 javascript eval 可能导致的 安全 问题吗 举个例子 非常好 如果您可以指向具有相同功能的现有网络资源 也可以 Edit 我只需要评
  • MS Access 在传递查询中使用表单

    我有一个名为菲茨 安特 达根 一个名为查询FietsAantDagen和一个名为Txtinput 我正在尝试使用 SQL Server 的直通查询 并使用文本表单的输入作为查询中的输入 Query SELECT Fiets id Fiets
  • 在c++/windows中获取线程状态

    必须有一个函数来获取系统中线程的当前状态 因为有这个应用程序 http www softwareverify com cpp thread status monitor index html 它必须使用某种 API 函数或其他东西 如何在
  • d3嵌套分组条形图

    首先 如果我的英语很难理解 我会尽力的 我对 D3 js 相当陌生 我正在尝试使用嵌套数据创建 D3 分组条形图 我查看了此处共享的一些解决方案 但它们仅显示一级分组 就我而言 数据将来自具有以下数据结构的 csv 文件 groups ca
  • 多次调用 Looper 会导致“向死线程上的处理程序发送消息”

    我使用 Executor 固定线程池 和我自己的 ThreadFactory 添加了 Looper Handler HANDLER new Handler Executor THREADS Executors newFixedThreadP