1

我需要ProgressDialog.dismiss从我的音乐服务中进行设置。我试过设置 AsyncTask

final class TheTask extends AsyncTask<Void, Void, Void>{
                ProgressDialog dialog = ProgressDialog.show(SomafmActivity.this, "", 
                        "Loading. Please wait...", true);   
                @Override
                protected void onPreExecute() {

             dialog.show();

                }

@Override
protected Void doInBackground(Void... params) {
final Intent i = new Intent(MusicService.ACTION_URL);
Uri uri = Uri.parse("http://sfstream1.somafm.com:8880");
i.setData(uri);
startService(i);
return null;
}

@Override
protected void onPostExecute(Void result) {
dialog.dismiss();
}

这工作正常,但它在startService(i) 调用开始时关闭对话框,因此对话框立即消失。然后我尝试从 MusicService 服务访问我的 ProgressDialog:

我的主要活动中的 ProgressDialog 声明:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.somafm);

        ProgressDialog dialog = ProgressDialog.show(SomafmActivity.this, "", 
                "Loading. Please wait...", true); 

}

在我的 MusicService 中:

public void onPrepared(MediaPlayer player) {
    // The media player is done preparing. That means we can start playing!
    mState = State.Playing;
    updateNotification(mSongTitle + " (playing)");
    configAndStartMediaPlayer();
    ProgressDialog dialog = (ProgressDialog) SomafmActivity.dialog; //This line I believe is wrong
    dialog.dismiss();
}

但我在 LogCat 中得到了 NullPointerException。我很确定从该位置关闭对话框会起到作用,因为直到流加载并开始播放后我才会收到错误消息。

我的问题是,我应该如何从我的音乐服务中正确引用我的 ProgressDialog?

4

2 回答 2

1

使用 hadler http://developer.android.com/reference/android/os/Handler.html在您的活动中创建处理程序,然后启动您的对话框并将处理程序传递给服务。服务启动时调用 hanler.handleMessage(message)。像Android中的这个进度对话框

于 2012-08-22T20:21:38.353 回答
0

您在访问对话框的方式方面存在一些问题。您正在尝试访问作为特定方法成员的对话框,因此在该方法之外无法访问。此外,您正在尝试静态访问它,而不是从对相关活动的引用中访问它。

为了更好的形式,您可能应该做的是在您的活动中设置广播接收器,并在准备好时从您的服务发送广播。然后,从您的活动中,关闭进度对话框。您的 asynctask 应该有一个构造函数,该构造函数将您的活动中的进度对话框作为参数。

您将您的成员放在错误的类中,并试图以没有意义的方式访问它们。

这是服务和接收器的教程http://www.vogella.com/articles/AndroidServices/article.html

我还建议您复习一下您的 java 以及与面向对象编程相关的各种访问/范围规则。

于 2012-08-22T20:05:17.223 回答