当前位置: 首页 > 面试题库 >

java.lang.RuntimeException:每个线程只能创建一个Looper

江同化
2023-03-14
问题内容

我有一个简单的线程是这样的:

public class AwesomeRunnable extends Thread {

    Handler thisHandler = null;
    Handler uihandler = null;
    String update = null;
    long time = 0;

    public AwesomeRunnable(Handler h, long howLong) {
        uihandler = h;
        time = howLong;
    }

    public void run() {
        Looper.prepare();
        thisHandler = new Handler();
  ...

编辑:开始运行的附加代码

public class StartCycle implements Runnable {

    @Override
    public void run() {

        pomodoroLeft = numPomodoro;
        while(pomodoroLeft > 0) {
            pomodoroLeft--;
            actualSeconds = 6 * ONE_SECOND;
            runnable = new AwesomeRunnable(myHandler, actualSeconds);
            runnable.start();
            waitForClock();

它是主要活动的内部类。但是, 此线程 不是在主 活动 运行,而是在 另一个 活动上 运行的线程
内部 运行

无论如何,此示例与此处
完全相同
,但是由于某种原因,它给了我java.lang.RuntimeException:每个线程只能创建一个Looper。

我没有创建任何其他循环程序,至少在任何地方都没有。


问题答案:

java.lang.RuntimeException:每个线程只能创建一个Looper

抛出异常是因为您(或核心Android代码)已经调用Looper.prepare()了当前执行线程。

以下内容检查当前线程是否已经存在Looper,如果不存在,则创建一个Looper,从而避免使用RuntimeException

    public void run() 
    {
            if (Looper.myLooper() == null)
            {
              Looper.prepare();
            }
            thisHandler = new Handler();

         ....
    }


 类似资料:
  • 我编写了代码示例: 每100毫秒提交一个新任务(总任务量-20)。每个任务持续时间-0.5秒。因此,可以并行执行5个任务,最佳执行时间为:20*100 500=2.5秒,池应创建5个线程 但我的实验显示为9.6秒。我打开jsvisualvm查看池创建了多少线程,我看到只创建了一个线程: 请更正我的线程池配置不正确的地方。

  • 最近我开始使用camel,我发现它有可能满足我的许多集成层需求。 我创建了一个java客户机应用程序(不在任何容器中运行),其中定义了两个路由: 路由1:将文件从传入文件夹1移动到文件夹2 route2:将文件内容从folderx移动到mq队列。 我启动我的应用程序,这些路由正在轮询这些文件夹并相应地路由消息。 谁能给我解释一下路线是如何工作的?骆驼(上下文)是否为每个路由创建线程。到底会发生什么

  • 问题内容: 我是线程新手。我想创建一些与主线程分开工作的简单函数。但这似乎不起作用。我只想创建一个新线程,并在那里独立于主线程发生的事情做一些事情。这段代码看起来很怪异,但到目前为止,我对线程的了解还很少。你能解释一下这是怎么回事吗? 问题答案: 您正在线程方法中调用该方法。但是只有在线程已经启动时才调用该方法。改为这样做:

  • 问题 你创建一个工作者线程池,用来响应客户端请求或执行其他的工作。 解决方案 concurrent.futures 函数库有一个 ThreadPoolExecutor 类可以被用来完成这个任务。 下面是一个简单的TCP服务器,使用了一个线程池来响应客户端: from socket import AF_INET, SOCK_STREAM, socket from concurrent.futures

  • 本文向大家介绍C#程序创建一个简单线程,包括了C#程序创建一个简单线程的使用技巧和注意事项,需要的朋友参考一下 为了创建线程,我创建了一个函数- 调用上述函数以创建线程,并创建一个新的ThreadStart委托- 示例 使用以下代码创建一个简单的线程。 输出结果