Runtime error "Can't create handler inside thread that has not called Looper.prepare()" in android application
I am writing android application for control Lego NXT and connect ROS. I use library LeJos for control Lego. I'v got runtime error "Can't create handler inside thread that has not called Looper.prepare()" when run motor NXT from rosjava node:
class NXTNode implements NodeMain {
public static RemoteMotor motor;
@Override
public GraphName getDefaultNodeName() {
return new GraphName("android/NXTNode");
}
@Override
public void onStart(final Node node) {
motor = new Motor().A;
motor.setPower(60);
motor.forward();
node.executeCancellableLoop(new CancellableLoop() {
@Override
protected void setup() {
}
@Override
protected void loop() throws InterruptedException {
Thread.sleep(10);
}
});
}
@Override
public void onShutdown(Node node) {
}
@Override
public void onShutdownComplete(Node node) {
}
}
Node "NXTNode" I run in
protected void init(NodeMainExecutor nodeMainExecutor) {
NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress());
nodeConfiguration.setMasterUri(getMasterUri());
nxt_node = new NXTNode();
nodeMainExecutor.execute(nxt_node, nodeConfiguration);
}
If I run motor from interface (onClick) then motor is running
public void onClick(View arg0) {
motor = new Motor().A;
motor.setPower(60);
motor.forward();
}
Where could be the problem? Thank you!
UPDATE:
FATAL EXCEPTION: pool-1-thread-7
java.lang.ExceptionInInitializerError
at org.ros.android.tutorial.pubsub.NXTNode.onStart(NXTNode.java:239)
at org.ros.internal.node.DefaultNode$1.run(DefaultNode.java:422)
at org.ros.internal.node.DefaultNode$1.run(DefaultNode.java:419)
at org.ros.concurrent.ListenerCollection$1.run(ListenerCollection.java:108)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.bluetooth.BluetoothAdapter$1.<init>(BluetoothAdapter.java:1012)
at android.bluetooth.BluetoothAdapter.<init>(BluetoothAdapter.java:1012)
at android.bluetooth.BluetoothAdapter.getDefaultAdapter(BluetoothAdapter.java:340)
at lejos.pc.comm.NXTCommAndroid.search(NXTCommAndroid.java:394)
at lejos.pc.comm.NXTConnector.search(NXTConnector.java:171)
at lejos.pc.comm.NXTConnector.connectTo(NXTConnector.java:222)
at lejos.pc.comm.NXTConnector.connectTo(NXTConnector.java:39)
at lejos.pc.comm.NXTCommandConnector.open(NXTCommandConnector.java:22)
at lejos.pc.comm.NXTCommandConnector.getSingletonOpen(NXTCommandConnector.java:41)
at lejos.nxt.Motor.<clinit>(Motor.java:15)
... 7 more
Could you post the full stack trace?
I updated question.