1

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);


    }


}
4

1 に答える 1

1

正確で完全なソリューションがどうあるべきかを言うのは難しいですが、サービスで実行されている別のスレッドを使用することをお勧めします. AsyncTask オブジェクトを複数回使用しようとしているため、AsyncTask でクラッシュが発生している可能性があります。それはできません。バックグラウンド タスクを実行するたびに、新しいオブジェクトを作成する必要があります。

于 2013-07-12T23:10:09.473 に答える