当一个服务正在启动时显示ProgressDialog

4

在服务准备就绪时显示进度对话框时,我遇到了严重的问题...由于服务有些繁重,所以需要一些时间来准备,因此我想在启动服务的同时显示ProgressDialog。

问题是它会在下一个活动开始之前显示ProgressDialog...我真的不知道是什么原因...

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

该服务在onStart方法结束时执行以下操作:
// Send broadcast so activities take it
Intent i = new Intent(Intent.ACTION_VIEW);
    sendOrderedBroadcast(i, null);

所以onReceive方法运行并且我们进入下一个活动。
1个回答

4
问题在于您没有在UI线程中运行ProgressDialog。请添加一个处理程序,用于处理您的UI线程中的消息。
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!


谢谢您的提问。我尝试了那个方法,但它没有起作用。最后我找到了问题所在。问题是我在 onStart 方法(在服务中)中做了大量的工作,因此该工作在某种程度上阻塞了系统的一些监听器,既广播接收器也不会被唤醒。一旦我将 onStart 代码迁移到一个并行线程中,它就像一个冠军一样工作了,无论是广播接收器还是处理程序 :D - Pedriyoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接