wrapperapps wrapperapps - 8 months ago 33
Android Question

how to make toast from another thread (sans runOnUiThread)

I need to make an Android toast from a processing thread, which is custom for OpenCV so I can't use runOnUiThread() as suggested here:
Android: Toast in a thread.

Most of this code is from the CVCamera sample app. But those unfamiliar, when I select the Surf menu button, the SURFProcessor is called like so:

else if (item.getTitle().equals("SURF")) {

defaultcallbackstack.addFirst(new SURFProcessor());


This Processor thread is run so that when I press the phone's camera button (capturePress = true), an image is taken and processing done. I want to call toasts method as shown:

class SURFProcessor implements NativeProcessor.PoolCallback {

public void process(int idx, image_pool pool, long timestamp,
NativeProcessor nativeProcessor) {
if(capturePress) {
String processMsg = processor.processFeatures(idx, pool, cvcamera.DETECT_SURF);
capturePress = false;
toasts(PROCESS_MESSAGE, processMsg);

Here is the toasts method, located in the main class extending Activity:

void toasts(int id, String msg) {
switch (id) {
Toast.makeText(MMRapp.this, msg, Toast.LENGTH_LONG).show();

Right now this code gives me an error: "can't create handler inside thread that has not called Looper.prepare()." How do I go about calling the toasts method? Or is it possible to have the toasts method listen for a change in processMsg? If possible, I can get by with sending the processMsg or changing a class variable instead. In essence, I need a String updated from this Processor thread.

Thank you very much, and I will provide more info/code if wanted.



use a handler and a runnable Make the Handler and runnable in the activity:

// these are members in the Activity class
Handler toastHandler = new Handler();
Runnable toastRunnable = new Runnable() {public void run() {Toast.makeText(Activity.this,...).show();}}

then to invoke it from your thread use


The handler executes the runnable in the thread it was created in.