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 create ハンドラ を使用してから、ダイアログを開始し、サービスにハンドラを渡します。サービスが開始されたら、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 に答える