2012-08-22 1 views
1

내 음악 서비스에서 ProgressDialog.dismiss을 설정해야합니다. 나는서비스에서 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(); 
} 

와 AsyncTask를 설정 시도하고 잘 작동하지만에 대화 상자를 일축 대화 상자가 즉시 사라집니다 있도록 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를 제대로 참조해야합니까?

답변

0

대화 상자에 액세스하는 방법에 몇 가지 문제가 있습니다. 특정 메서드의 멤버이고 해당 메서드 외부에서 액세스 할 수없는 대화 상자에 액세스하려고합니다. 또한 문제의 활동에 대한 참조가 아닌 정적으로 액세스하려고합니다.

더 나은 양식을 위해해야 ​​할 일은 활동에 브로드 캐스트 수신자를 설정하고 준비가되면 서비스에서 브로드 캐스트를 전송하는 것입니다. 그런 다음 활동에서 진행 대화 상자를 종료하십시오. asynctask에는 액티비티의 진행 대화 상자를 매개 변수로 취하는 생성자가 있어야합니다.

회원은 잘못된 수업을 듣고 이해가되지 않는 방식으로 액세스하려고합니다.

다음은 서비스 및 수신기

http://www.vogella.com/articles/AndroidServices/article.html 나는 또한 당신이 당신의 자바와 객체 지향 프로그래밍과 관련된 다양한 액세스/범위 규칙에 브러쉬 추천을위한 튜토리얼입니다.

+0

감사합니다. 나는 그것을 시도 할 것입니다. 그러나 두 번째 시나리오에서는 ProgressDialog를 주 활동의 onCreate 메서드로 이동합니다. 여전히 작동하지 않습니까? –

+0

죄송합니다,이 응답을 보았습니다. 잘하면이 작업을 계속 진행 했으므로 onCreate 메서드의 범위 내에서만 oncreate의 "dialog"변수에 액세스 할 수 있습니다. Activity.dialog처럼 정적으로 액세스 할 수 없습니다. 그것은 정적 변수가 아닙니다. 심지어 액티비티 클래스의 멤버가 아니기 때문에 액티비티 클래스의 인스턴스에서 액세스 할 수는 없으며 onCreate 메서드에서만 사용할 수 있습니다. 이것들은 정말로 당신이 계속하기 전에 닦아야 할 가장 기본적인 자바 개념입니다. –