私は音楽ファイルを再生するためにAsyncTask取るものを持っています。ArrayListこのdoInBackgroundメソッドでは、ArrayListをループして、曲を1つずつ再生します。TextViewUIなどにステータスメッセージを表示して、再生中の曲を示したいのですが、エラーが発生します。ビュー階層を作成した元のスレッドのみがビューにアクセスできます。 からUIウィジェットのみを更新しonPreExecute()、onPostExecute()リストがすでに再生されている場合。これを行うために使用する方法onProgressUpdateまたは他のAsyncTask方法はありますか?
3 に答える
これは確かに可能です。曲名、アルバム名、アーティスト名に表示したい文字列がある場合の基本的な例を次に示します(AsyncTaskは完全には実装していませんが、onProgressUpdateに関連する部分だけを実装しています)。
private class myAsyncTask extends AsyncTask<Void, String, Void>
{
protected Void doInBackground(Void... voids)
{
//Get some list of songs, named songs
for(Song song in songs)//This is the loop where you're playing your songs
{
publishProgress(song.name, song.album, song.artist);
//Play the song and wait for it to finish
}
return null;
}
protected void onProgressUpdate(String... songData)
{
//Assuming three text views exist to display your data
nameTextView.setText(songData[0]);
albumTextView.setText(songData[1]);
artistTextView.setText(songData[2]);
}
}
注意すべき重要な点は、山かっこ内の2番目のクラスは、のパラメーターのタイプであり、onProgressUpdateこれpublishProgressはdoInBackgroundで呼び出されてトリガーされonProgressUpdateます。onProgressUpdateのほとんどの例では、ProgressBarの塗りつぶしを増やす必要がありますが、メソッドはUIスレッドで実行され、AsyncTaskからアクセスできる任意のビューと対話できます。それでも問題が解決しない場合は、現在のAsyncTaskを投稿して、このサンプルクラスを既存のクラスに簡単に統合できるようにしてください。詳細については、AsyncTaskのドキュメントを参照してください。お役に立てれば!
onProgressUpdate()を使用して、UIスレッドから更新を実行できるはずです。または、このようにすることもできます(これは、AsyncTaskを使用しない場合に一般的です)。
次のようにUIを更新するイベントをUIスレッドに投稿します。
view.post( new Runnable() {
@Override
public void run() {
// Update your UI
}
});
ビューにアクセスして更新できるように、UIスレッドで実行されます。
はいあります。
AsyncTaskをデカールするときは、タスクの各部分に入るタイプをデカールします。
public class MyTask extends AsyncTask<URL,Integer,Long> {
.
.
.
}
この例では、順番にタイプを示します。
URLdoInBackground経由で渡されますexecuteIntegeronProgressUpdate(経由publishProgress)に到達しますLongに到達しonPostExecute、の戻り値もdoInBackground
doInBackground()で、を呼び出すことができます。publishProgress()これonProgessUpdate()により、メインスレッドが呼び出されます(メインスレッドでAsyncTaskを作成したと仮定します)。
使用法(リンク)の下のリファレンスドキュメントに完全な例があります。