Web または MP3 ストリーム データ (ID3 タグ) から常に結果を取得し、それらを TextViews に表示するアクティビティがあります。
したがって、解析は、ストリームを再生するサービスまたはファイルを解析する AsyncTask に実装できます。タイマーに従って、アクティビティが表示されたときにのみデータをロードする必要があります。
解析自体は実現できますが、このタスクを常に実行してアクティビティ UI を更新するにはどうすればよいでしょうか。
いくつかのリンクを見て、いくつかの独自のコードを試しましたが、1 回の起動でしか機能しませんでした。このサイトからの AsyncTask の複数呼び出しの例は機能しませんでした (クラッシュ)。
常にUIを更新するAsyncTaskのタイマー呼び出し、またはUI更新を伴うServiceメソッドのタイマー呼び出しの安定した簡単な動作例を教えてください。
私が理解しているように、onCreate と onResume の UI スレッドでタイマーを呼び出す必要がありますか?
ありがとう。
更新されたコード: (これは、UI を更新するタイマーの作業バージョンです。AsyncTask の作業でテストする必要があります)
doUpdate(); // in the UI onCreate
TimerTask updateTask;
final Handler handler = new Handler();
Timer timer = new Timer();
public void doUpdate(){
updateTask = new TimerTask() {
public void run() {
handler.post(new Runnable() {
public void run() {
Random r = new Random();
int nm=r.nextInt(100-1) + 1;
updatePlaylist(String.valueOf(nm)); //here we update the TextView
// BUT CALLING:
// new PlayList(PlayerActivity.this).execute(this);
// doesn't work! It's an AsyncTask.
}
});
}};
timer.schedule(updateTask, 0, 2000);
}
では、新しい AsyncTask オブジェクト コード行が間違っているのではないでしょうか?
class PlayList extends AsyncTask<Activity, Void, String> {
private PlayerActivity act;
public PlayList(Activity activity) {
this.act = (PlayerActivity) activity;
}
protected String doInBackground(Activity... activities) {
String result;
Random r = new Random();
int num=r.nextInt(100-1) + 1;
result=String.valueOf(num);
//result=act.mp3Service.getPlaylist(); // will work later
return result;
}
protected void onPostExecute(String result) {
act.updatePlaylist(result);
}
}