Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.lang.RuntimeException: Only one Looper may be created per thread

I have a simple thread that goes like this:

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();
  ...

EDIT: ADDED CODE THAT STARTS THE RUNNABLE

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();

It is an inner class of a main activity. This thread, however runs not on the main activity, but inside of another thread that runs on the main activity.

Anyway, this example is exactly the same as here, but for some reason it gives me java.lang.RuntimeException: Only one Looper may be created per thread.

I did not create any other loopers, at least explicitly anywhere.

like image 892
user3081519 Avatar asked Apr 13 '14 03:04

user3081519


2 Answers

java.lang.RuntimeException: Only one Looper may be created per thread

The exception is thrown because you (or core Android code) has already called Looper.prepare() for the current executing thread.

The following checks whether a Looper already exists for the current thread, if not, it creates one, thereby avoiding the RuntimeException.

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

         ....
    }
like image 182
Aown Raza Avatar answered Nov 12 '22 10:11

Aown Raza


Instead of just calling Looper.prepare();, first check if Looper does not already exist for your Thread, if not, call that function. Like this:

if (Looper.myLooper()==null)
    Looper.prepare();
like image 6
XPscode Avatar answered Nov 12 '22 10:11

XPscode