Showing ProgressDialog while a Service is being started
Asked Answered
T

1

4

I'm having serious problems when showing a ProgressDialog while a service is getting ready... The service takes time to get ready as it's a bit heavy, so I want to show the ProgressDialog meanwhile it's started.

The thing is that it shows the ProgressDialog right before the next activity starts... I really don't find what it is...

package org.pfc;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class ConnectActivity extends Activity {

    // FIELDS------------------------------------------------------------------

    protected LocalService mSmeppService;
    private ProgressDialog progressDialog;

    private Thread tt;

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            // Gets the object to interact with the service
            mSmeppService = ((LocalService.LocalBinder) service).getService();
        }

        public void onServiceDisconnected(ComponentName className) {
            // This is called when the connection with the service has been
            // unexpectedly disconnected -- that is, its process crashed.
            // Because it is running in our same process, we should never
            // see this happen.
            mSmeppService = null;
        }
    };

    // For getting confirmation from the service
    private BroadcastReceiver serviceReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i(TAG, "receiver onReceive...");

            if (progressDialog.isShowing())
                progressDialog.dismiss();

            // Change activity
            Intent groupsActivityIntent = new Intent(ConnectActivity.this,
                    GroupsActivity.class);
            startActivity(groupsActivityIntent);
        }
    };

    // METHODS ----------------------------------------------------------------

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (LocalService.isRunning) {
            // TODO start ListActivity
            Log.i(TAG, "Starting GroupsScreen");

            Intent i = new Intent(ConnectActivity.this, GroupsActivity.class);
            startActivity(i);
        } else {

            setContentView(R.layout.connect_screen);

            // Add listener to the button
            Button buttonConnect = (Button) findViewById(R.id.button_connect);
            buttonConnect.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    processThread();
                }
            });
        }
    }


    // PRIVATE METHODS --------------------------------------------------------

    private void processThread() {

        progressDialog = ProgressDialog.show(ConnectActivity.this, "",
                "Loading. Please wait...", true, false);

        tt = new Thread() {
            public void run() {

                // Register broadcastReceiver to know when the service finished
                // its creation
                ConnectActivity.this.registerReceiver(serviceReceiver,
                        new IntentFilter(Intent.ACTION_VIEW));

                // Starts the service
                startService(new Intent(ConnectActivity.this,
                        LocalService.class));

                Log.i(TAG, "Receiver registered...");
            }
        };
        tt.start();
    }
}

The service executes by the end of the onStart method this:

// Send broadcast so activities take it
Intent i = new Intent(Intent.ACTION_VIEW);
    sendOrderedBroadcast(i, null);

So the onReceive method runs and we go to the next activity

Toadeater answered 1/12, 2010 at 18:26 Comment(0)
I
4

The problem is that you are not running ProgressDialog in a UI thread.

Add a handler that will handle messages in your UI thread.

private static final int UPDATE_STARTED = 0;
private static final int UPDATE_FINISHED = 1;

private Handler handler = new Handler(){
  @Override public void handleMessage(Message msg) {
    switch (msg.what) {
     case UPDATE_STARTED:
       progressDialog = ProgressDialog.show(ConnectActivity.this, "",
            "Loading. Please wait...", true, false);                
     break;  
     case UPDATE_FINISHED:
       if(progressDialog.isShowing()){
         progressDialog.dismiss();    
       }            
     break;
    }
  }
};


private void processThread() {
  Message m = new Message();
  m.what = UPDATE_STARTED;
  handler.sendMessage(m);

  //Your working code

  m = new Message();
  m.what = UPDATE_FINISHED;
  handler.sendMessage(m);
}

good luck!

Interpol answered 6/12, 2010 at 18:38 Comment(1)
Thanks for asking. I tried that but it didn't work. I found out the problem in the end. The thing is that I was doing heavy work within the onStart method (in the Service), so that work was blocking somehow some listeners of the system and neither BroadCastReceivers nor Handlers were being awaken. Once I migrate the onStart code to a parallel thread, it worked like a champ, both with BroadcastReceivers and Handlers :DToadeater

© 2022 - 2024 — McMap. All rights reserved.