【问题标题】:Showing ProgressDialog while a Service is being started在服务启动时显示 ProgressDialog
【发布时间】:2010-12-01 18:26:40
【问题描述】:

在服务准备就绪时显示 ProgressDialog 时遇到严重问题...服务需要时间准备好,因为它有点重,所以我想在 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 方法运行,我们进入下一个活动

【问题讨论】:

    标签: android service progressdialog


    【解决方案1】:

    问题是您没有在 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);
    }
    

    祝你好运!

    【讨论】:

    • 感谢您的提问。我试过了,但没有用。我最终发现了问题所在。问题是我在 onStart 方法中(在服务中)做了繁重的工作,因此工作以某种方式阻塞了系统的一些侦听器,并且 BroadCastReceivers 和 Handlers 都没有被唤醒。一旦我将 onStart 代码迁移到并行线程,它就可以像冠军一样工作,无论是 BroadcastReceivers 还是 Handlers :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多