如何在Service中显示ProgressDialog

时间:2013-08-15 22:45:31

标签: android android-service progressdialog

我已经编写了一个流式传输rtsp链接的应用程序。我已经在我的自定义服务类中流式传输了网址。我希望在启动音乐之前显示一个proggresdialog而其他单词中的url正在加载。这是我的代码; < / p>

public class MyMediaPlayerService extends Service implements OnCompletionListener{

private String path = "rtsp://someURL";
MediaPlayer mediaPlayer;
private ProgressDialog pd;

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setOnCompletionListener(this);
}

public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
}

public void surfaceDestroyed(SurfaceHolder surfaceholder) {
}

public void surfaceCreated(SurfaceHolder holder) {
}

public void onCompletion(MediaPlayer _mediaPlayer) {
    stopSelf();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    if (!mediaPlayer.isPlaying()) {
        pd = new ProgressDialog(getApplicationContext());
        pd.setMessage("Loading...");
        pd.setCancelable(false);
        pd.show();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(path);
            mediaPlayer.prepareAsync();
        } catch (Exception e) {
            e.printStackTrace();
        }

        mediaPlayer
                .setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        pd.dismiss();
                        mp.start();
                    }
                });
    }

    return START_NOT_STICKY;
}



public void onDestroy() {
    if (mediaPlayer.isPlaying()) {
        mediaPlayer.stop();

    }
    mediaPlayer.release();
}

}

我也在日志中收到此错误;

08-15 22:42:15.384: E/AndroidRuntime(1090): FATAL EXCEPTION: main
08-15 22:42:15.384: E/AndroidRuntime(1090): java.lang.RuntimeException: Unable to start     service com.applogist.servis.MyMediaPlayerService@42417340 with Intent { cmp=com.applogist.standartfm/com.applogist.servis.MyMediaPlayerService }:    android.view.WindowManager$BadTokenException: Unable to add window -- 
token null is not for an application

如何现在显示一个proggres对话框?

1 个答案:

答案 0 :(得分:0)

建议官方开发者指南使用通知Service|Sending Notifications to the User进行此操作。

此外,如果您需要在服务中播放音乐,则需要在另一个主题中进行播放。

  

警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定)。这意味着,如果您的服务要进行任何CPU密集型工作或阻止操作(例如MP3播放或网络),您应该在服务中创建一个新线程来完成这项工作。通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互。

但是,如果您坚持要显示对话框,则只有在下载完所有音乐后才能播放音乐。我认为你可以使用一个具有内部AsyncTask类的对话框类。您可以在AsyncTask的doInBackground(Params ... params)方法中执行下载任务,并通过AsyncTask的@Override protected void onProgressUpdate(Progress ... values)更新对话框的UI。