Service到底要不要自己调用Looper.prepare()?

============问题描述============

写了一个Service, 在里面启动了一个线程,于是实例化了一个Handler来处理消息。

但运行时抛出异常说不能在没有调用Looper.prepare()的线程中创建Handler。

然后我在Service的onCreate()中调用Looper.prepare(),却又被抛出异常,说一个线程中只能有一个Looper。

晕了,到底应该怎么办呢?

============解决方案1============

主线程本身就有一个Looper  它已经调用了prepare()   你要去你自己开启的子线程调用prepare()

============解决方案2============

http://my.eoe.cn/lakeside/archive/15571.html

============解决方案3============

引用 1 楼 a425801998 的回复:

主线程本身就有一个Looper  它已经调用了prepare()   你要去你自己开启的子线程调用prepare()

这样的话,这个thread会一直在后台运行着...

============解决方案4============

thread 你可以不用就关掉的

============解决方案5============

创建Looper以后 loop了么?需要写Looper.loop();

一个Thread只可以set一个Looper,service默认是主线程,在Activity启动的时候已经loop起来了,所以会抛出异常。

 private static void prepare(boolean quitAllowed) {

        if (sThreadLocal.get() != null) {

            throw new RuntimeException("Only one Looper may be created per thread");

        }

        sThreadLocal.set(new Looper(quitAllowed));

    }

============解决方案6============

Service 直接在oncreate里创建handler就可以啊。谁知道你怎么写的,无码无真相。

时间: 2024-10-02 14:53:32

Service到底要不要自己调用Looper.prepare()?的相关文章

Android中Looper的实现原理,为什么调用Looper.prepare()就在当前线程关联了一个Looper对象,它是如何实现的。

1.线程间通信机制 首先,looper.handler.messagequeue三者共同实现了android系统里线程间通信机制. 如在A.B两个子线程之间需要传递消息,首先给每个子线程绑定一套handler.looper.messagequeue机制,然后这三个对象都与其所属线程对应. 然后A线程通过调用B线程的Handler对象,发送消息.这个消息会被Handler发送到B线程的messagequeue中,而属于B线程的Looper对象一直在for循环里无限遍历MessageQueue, 一

Android 线程 Looper.prepare()、Looper.loop() 使用

优化项目过程中发现了一个很Low的问题,整理一下,备忘: 说问题之前先看下HandlerThread的定义 一个封装了looper的线程: Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,从消息队列里取消息,处理消息. 注:写在Looper.loop()之后的代码不会被立即执行,当调用后mHandler.get

Android -- Looper.prepare()和Looper.loop() —深入版

Android中的Looper类,是用来封装消息循环和消息队列的一个类,用于在android线程中进行消息处理.handler事实上能够看做是一个工具类,用来向消息队列中插入消息的. (1) Looper类用来为一个线程开启一个消息循环.     默认情况下android中新诞生的线程是没有开启消息循环的.(主线程除外,主线程系统会自己主动为其创建Looper对象,开启消息循环.)     Looper对象通过MessageQueue来存放消息和事件.一个线程仅仅能有一个Looper,相应一个M

Looper.prepare()和Looper.loop()

什么时候需要 Looper Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,使用Looper.prepare()和Looper.loop()创建了消息队列就可以让消息处理在该线程中完成. 使用Looper需要注意什么 写在Looper.loop()之后的代码不会被立即执行,当调用后mHandler.getLoo

Android java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

E/AndroidRuntime(7200): Uncaught handler: thread Thread-8 exiting due to uncaught exceptionE/AndroidRuntime( 7200): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 原因是非主线程中默认没有创建Looper对象,需要先调用Looper

android-86-Can't create handler inside thread that has not called Looper.prepare()

以下是Android API中的一个典型的Looper thread实现: //Handler不带参数的默认构造函数:new Handler(),实际上是通过Looper.myLooper()来获取当前线程中的消息循环,//而默认情况下,线程是没有消息循环的,所以要调用 Looper.prepare()来给线程创建消息循环,然后再通过,Looper.loop()来使消息循环起作用. class LooperThread extends Thread{public Handler mHandler

【转】Android -- Looper.prepare()和Looper.loop()

Looper.prepare()和Looper.loop() 原文地址:http://blog.csdn.net/heng615975867/article/details/9194219 Android中的Looper类,是用来封装消息循环和消息队列的一个类,用于在android线程中进行消息处理.handler其实可以看做是一个工具类,用来向消息队列中插入消息的. (1) Looper类用来为一个线程开启一个消息循环.     默认情况下android中新诞生的线程是没有开启消息循环的.(主

android Looper.prepare()(转载)

Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,从消息队列里取 消息,处理消息. 注:写在Looper.loop()之后的代码不会被立即执行,当调用后 mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行.Looper对象通过MessageQueue 来存放消息和事

Android 线程更新UI报错 : Can't create handler inside thread that has not called Looper.prepare()

MainActivity中有一个按钮,绑定了save方法 public void save(View view) { String title = titleText.getText().toString(); String timelength = lengthText.getText().toString(); ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new NewsService(getApp