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.
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? –
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
¿Está tratando de mostrar cualquier cuadro de diálogo o diálogo de progreso en su método RadioPlayerActivity onclick? – Ads