UPDATE - 2016
The best alternative is to use RxAndroid (specific bindings for RxJava) for the P in MVP to take charge fo data.
Start by returning Observable from your existing method.
private Observable<PojoObject> getObservableItems() {
    return Observable.create(subscriber -> {
        for (PojoObject pojoObject: pojoObjects) {
            subscriber.onNext(pojoObject);
        }
        subscriber.onCompleted();
    });
}
Use this Observable like this -
getObservableItems().
subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread()).
subscribe(new Observer<PojoObject> () {
    @Override
    public void onCompleted() {
        // Print Toast on completion
    }
    @Override
    public void onError(Throwable e) {}
    @Override
    public void onNext(PojoObject pojoObject) {
        // Show Progress
    }
});
}
----------------------------------------------------------------------------------------------------------------------------------
I know I am a little late but here goes.
Android basically works on two thread types namely UI thread and background thread. According to android documentation - 
Do not access the Android UI toolkit from outside the UI thread to fix this problem, Android offers several ways to access the UI thread from other threads. Here is a list of methods that can help:
Activity.runOnUiThread(Runnable)  
View.post(Runnable)  
View.postDelayed(Runnable, long)
Now there are various methods to solve this problem. 
I will explain it by code sample:
runOnUiThread
new Thread()
{
    public void run()
    {
        myactivity.this.runOnUiThread(new Runnable()
        {
            public void run()
            {
                //Do your UI operations like dialog opening or Toast here
            }
        });
    }
}.start();
LOOPER
Class used to run a message loop for a thread. Threads by default do
  not have a message loop associated with them; to create one, call
  prepare() in the thread that is to run the loop, and then loop() to
  have it process messages until the loop is stopped.
class LooperThread extends Thread {
    public Handler mHandler;
    public void run() {
        Looper.prepare();
        mHandler = new Handler() {
            public void handleMessage(Message msg) {
                // process incoming messages here
            }
        };
        Looper.loop();
    }
}
AsyncTask
AsyncTask allows you to perform asynchronous work on your user
  interface. It performs the blocking operations in a worker thread and
  then publishes the results on the UI thread, without requiring you to
  handle threads and/or handlers yourself.
public void onClick(View v) {
    new CustomTask().execute((Void[])null);
}
private class CustomTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... param) {
        //Do some work
        return null;
    }
    protected void onPostExecute(Void param) {
        //Print Toast or open dialog
    }
}
Handler
A Handler allows you to send and process Message and Runnable objects
  associated with a thread's MessageQueue.
Message msg = new Message();
new Thread()
{
    public void run()
    {
        msg.arg1=1;
        handler.sendMessage(msg);
    }
}.start();
Handler handler = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
        if(msg.arg1==1)
        {
            //Print Toast or open dialog        
        }
        return false;
    }
});