我需要从我的音乐服务中设置ProgressDialog.dismiss
。我尝试使用
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)调用的 start 处的对话框,因此对话框立即消失。然后我尝试从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?
答案 0 :(得分:1)
在您的活动中使用hadler http://developer.android.com/reference/android/os/Handler.html创建处理程序,然后启动对话框并将处理程序传递给servise。启动服务时,请调用hanler.handleMessage(message)。像这样Progress dialog in Android
答案 1 :(得分:0)
您在访问对话框时遇到了一些问题。您正在尝试访问对话框,该对话框是特定方法的成员,因此无法在该方法之外访问。此外,您试图静态访问它,而不是从对相关活动的引用中访问它。
您应该为更好的表单做些什么,在您的活动中设置广播接收器,并在准备好时从您的服务发送广播。然后,从您的活动中,关闭进度对话框。你的asynctask应该有一个构造函数,它从你的活动中获取进度对话框作为参数。
您将您的成员放在错误的类中,并尝试以无意义的方式访问它们。
这是服务和接收器的教程http://www.vogella.com/articles/AndroidServices/article.html
我还建议你了解java以及与面向对象编程相关的各种访问/范围规则。