2012-08-22 21 views
1

我需要从我的音乐服务中设置ProgressDialog.dismiss。我试图建立的AsyncTask与从服务中获取对ProgressDialog的引用

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(我)调用的使对话框立即消失。于是我试着从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

您对如何访问对话框有一些问题。您正尝试访问属于特定方法成员的对话框,因此无法在该方法之外访问。此外,您正试图静态访问它,而不是从有关活动的引用中进行访问。

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

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

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

我也建议你刷上你的Java和面向对象编程相关的各种接入/范围规则的教程。

+0

好的,谢谢我会尝试。但在第二种情况下,我将ProgressDialog移动到主活动的onCreate方法中。那仍然行不通? –

+0

抱歉,刚刚注意到这个响应,希望你已经从这里开始,但为了以防万一,你的oncreate中的“对话”变量只能在onCreate方法的范围内访问。你不能象Activity.dialog一样静态地访问它,就像你所做的那样。它不是一个静态变量。你甚至无法从活动类的实例访问它,因为它甚至不是活动类的成员,而只是在你的onCreate方法中。这些实际上是在继续之前需要继续研究的最基本的Java概念。 –