2012-04-04 13 views
7

Estoy transmitiendo una transmisión de radio. Quiero generar una notificación cuando la canción en la transmisión cambia. Estoy usando streamscraper (http://code.google.com/p/streamscraper) para obtener los metadatos de la transmisión actual, e intento generar una notificación cuando cambian los metadatos.Llamando a Async Tarea

Aquí está la tarea asincrónica que creé para implementar esto.

public class updateMetadata extends 
     AsyncTask<String, Void, PlaylistSong<BaseArtist, BaseAlbum>> { 

    private static final String TAG = updateMetadata.class.getSimpleName(); 
    private PlaylistSong<BaseArtist, BaseAlbum> oldSong = null; 
    private PlaylistSong<BaseArtist, BaseAlbum> newSong = null; 
    private metadataHarvester fetchMetadata = new metadataHarvester(); 
    private String streamUrl = null; 

    @Override 
    protected PlaylistSong<BaseArtist, BaseAlbum> doInBackground(String... urls) { 
     for (String url : urls) { 
      try { 
       oldSong = fetchMetadata.prepareRadioSong(url); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      streamUrl = url; 
     } 

     newSong = oldSong; 

     while (newSong == oldSong) { 
      try { 
       newSong = fetchMetadata.prepareRadioSong(streamUrl); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     return newSong; 
    } 

    @Override 
    protected void onPostExecute(PlaylistSong<BaseArtist, BaseAlbum> song) { 
     Log.v(TAG, "New Song: " + song.getTitle()); 
    } 
} 

La aplicación se basa en dos proyectos vinculados. El Proyecto A es donde se inicializa la Aplicación y el Proyecto B contiene las colecciones y la lógica de reproducción. Quiero usar esta tarea en el Proyecto B. Aquí está la función de reproducción (en el proyecto B).

protected synchronized void play(final IMediaPlayerWrapper mp) { 

     streamURL = streamFetcher.getStreamUrl(); 
     Log.i(TAG, "Stream URL: " + streamURL); 
     try { 
      Log.i(TAG, "Testing metadata harvester"); 
      radioSong = metadata.prepareRadioSong(streamURL); 
     } catch (Exception e) { 
      Log.w(TAG, e); 
     } 
     updateMetadata(radioSong); 
     currentPlaylistManager.clearPlaylist(); 
     currentPlaylistManager.appendSongAtEnd(radioSong); 
     listenerInformer.informCurrentSongChangeListener(radioSong); 
     try { 
      mp.setSong(radioSong, streamURL); 
      mp.play(); 
      if (mp.isPlaying()) { 
       setPlayerState(PlayerState.PLAY); 
      } 
     } catch (Exception e) { 
      Log.w(TAG, e); 
      setPlayerState(PlayerState.ERROR); 
     } 


     updateMetadata metadataChecker = new updateMetadata(); 
     metadataChecker.execute(streamURL); 
    } 

Cuando intento ejecutarlo, la aplicación se bloquea.

Aquí, es la traza de error completo:

04-04 23:34:34.975: E/WindowManager(18080): Activity ch.ethz.dcg.pancho2.view.radioplayer.RadioPlayerActivity has leaked window [email protected] that was originally added here 
04-04 23:34:34.975: E/WindowManager(18080): android.view.WindowLeaked: Activity ch.ethz.dcg.pancho2.view.radioplayer.RadioPlayerActivity has leaked window [email protected] that was originally added here 
04-04 23:34:34.975: E/WindowManager(18080):  at android.view.ViewRoot.<init>(ViewRoot.java:258) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.app.Dialog.show(Dialog.java:241) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.app.ProgressDialog.show(ProgressDialog.java:107) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.app.ProgressDialog.show(ProgressDialog.java:90) 
04-04 23:34:34.975: E/WindowManager(18080):  at ch.ethz.dcg.pancho2.view.radioplayer.RadioPlayerActivity$5.onClick(RadioPlayerActivity.java:276) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.view.View.performClick(View.java:2485) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.view.View$PerformClick.run(View.java:9080) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.os.Handler.handleCallback(Handler.java:587) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.os.Handler.dispatchMessage(Handler.java:92) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.os.Looper.loop(Looper.java:130) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-04 23:34:34.975: E/WindowManager(18080):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-04 23:34:34.975: E/WindowManager(18080):  at java.lang.reflect.Method.invoke(Method.java:507) 
04-04 23:34:34.975: E/WindowManager(18080):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-04 23:34:34.975: E/WindowManager(18080):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-04 23:34:34.975: E/WindowManager(18080):  at dalvik.system.NativeStart.main(Native Method) 

estoy confundido en mi comprensión de las tareas asíncronas. ¿No es esta la forma correcta de usarlos?

EDITAR: Se agregó la respuesta por separado.

+0

Básicamente, intenta mostrar el cuadro de diálogo después de su actividad de salida. Hay varias razones para que lo anterior ocurra, pero no veo nada sobre el diálogo en su código. ¿Usas el diálogo? –

+0

No, estoy intentando registrar la nueva canción después de que la canción actual haya cambiado. Sin diálogo ni nada en esta etapa. Ya tengo una configuración de escucha onSongChanged. Puedo llamarlo cuando estoy seguro de que la comprobación de nuevas canciones está funcionando. – rahulthewall

+0

¿Está tratando de mostrar cualquier cuadro de diálogo o diálogo de progreso en su método RadioPlayerActivity onclick? – Ads

Respuesta

2

Resuelto usando TimerTask.

private void pollMetadata() { 

    lastSong = radioSong; 
    newSong = lastSong; 
    Log.i(TAG, "Old Song: " + lastSong.getTitle()); 
    Log.i(TAG, "New Song: " + newSong.getTitle()); 

    updateMetadataTask = new TimerTask() { 

     @Override 
     public void run() { 
      try { 
       newSong = metadata.prepareRadioSong(streamURL); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      Log.i(TAG, "Old Song: " + lastSong.getTitle()); 
      Log.i(TAG, "New Song: " + newSong.getTitle()); 

      if (newSong.getTitle().equals(lastSong.getTitle())) { 
       Log.v(TAG, "SAME SONG"); 
      } 
      else { 
       Log.v(TAG, "SONG CHANGED"); 
       lastSong = newSong; 

       currentPlaylistManager.clearPlaylist(); 
       currentPlaylistManager.appendSongAtEnd(newSong); 
       listenerInformer.informCurrentSongChangeListener(newSong); 

      } 

     } 
    }; 

    t.schedule(updateMetadataTask, 300, 30000); 
} 
Cuestiones relacionadas