【问题标题】:How to show ProgressDialog in Service如何在服务中显示 ProgressDialog
【发布时间】:2013-08-16 07:19:07
【问题描述】:

我编写了一个流式传输 rtsp 链接的应用程序。我在我的自定义服务类中流式传输 url。我想在开始音乐之前显示一个 proggresdialog,换句话说,在加载 url 时。这是我的代码;

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

现在如何显示进度对话框?

【问题讨论】:

  • 服务用于后台任务。当您在后台执行某项操作时,为什么要显示进度对话框。
  • 因为加载。流加载时,我想显示进度对话框。如果流正在播放,我将关闭进度对话框
  • 你是怎么解决这个问题的?现在我也遇到了同样的问题。

标签: android android-service progressdialog


【解决方案1】:

建议使用官方开发者指南中的 Notification Service|Sending Notifications to the User 来执行此操作。

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

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

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

【讨论】:

  • 我正在服务中流式传输音乐。那么我该如何使用 AsyncTask 以及在哪里可以使用?
  • 好的。我可以使用 Proggres 对话框吗?
  • 你不能同时使用 Service 和 AsyncTask 。至少我的建议不是在这种情况下。我的建议是您要么使用服务,但尝试使用 Notification 或 Toast 来通知用户,或者您在 Activity 或 Fragment 中使用 AsyncTask 并显示对话框或更新您想要的任何 UI。
  • AsyncTask 很有用,因为它有非常有用的方法适合您的情况。您可以使用doInBackground (Params... params)在后台下载您的音乐流,当下载有进度时,您可以调用publishProgress(Progress...values),它会自动调用onProgressUpdate(Progress...values),后一种方法是您将 ProgressDialog 的进度部分更新到 UI 的位置。
  • 我没有从你的建议中理解任何事情。首先如果我在使用此服务的 Activity 中使用 AsyncTask,我无法控制流是否正在播放。如何控制流是否在使用此服务的 Activity 中是否正在播放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多