我有一个小部件在我的主屏幕上,负责显示当前的歌曲,是可以切换歌曲等.目前,我只是试图实现它的能力,以显示当前的歌曲。
我已经附上了所有相关代码..。还有评论。没有引发错误,而且它确实会更新,但只有在我在主屏幕上创建小部件的新实例时才会这样做。为了解释我是否在开始播放歌曲之前放置了一个小部件,当我开始播放应用程序中的歌曲时,它会说“不播放”,但它仍然会继续说“不播放”,然后当我创建一个类型和位置相同的新小部件时,它将保留更新的信息,而旧的小部件仍然会说不播放。这继续如果我改变歌曲,我jsut放置的将不会更新,也不会是一个不播放,但创建一个新的将显示更新.
MainActivity接收MusicManager的呼叫并发送小部件更新(works?)
public MusicManager musicManager = MusicManager.getInstance(new MusicManager.MediaplayerUpdateInterface() {
public void updateUI(int type) {
updateMediaplayerViews(type);
}
});
public void updateMediaplayerViews(int type) {
switch(type) {
case 0:
this.runOnUiThread(new Runnable() {
public void run() {
System.out.println("value? "+(musicManager.getCurrentTimeBAR()/musicManager.getSongLengthBAR()));
SongListFragment.musicManagerProgress.setProgress((int)((musicManager.getCurrentTimeBAR()/(double)musicManager.getSongLengthBAR())*100));
SongListFragment.musicManagerCurrent.setText(musicManager.getCurrentTime());
if(!SongListFragment.hasSetImage) {
SongListFragment.musicManagerTotal.setText(musicManager.getSongLength());
SongListFragment.musicManagerSongName.setText(musicManager.getCurrentSongInfo().getName().length() > 22 ? musicManager.getCurrentSongInfo().getName().substring(0, 19) + "..." : musicManager.getCurrentSongInfo().getName());
new DownloadListAdapter.DownloadImageTask(SongListFragment.musicManagerImageView).execute(musicManager.getCurrentSongInfo().getImgurl());
SongListFragment.hasSetImage = true;
}
}
});
break;
case 10:
this.runOnUiThread(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(getBaseContext(), TrinityWidget.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
int[] ids = {TrinityWidget.widgetId};
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
getBaseContext().sendBroadcast(intent);
}
});
break;
}
}MusicManager发送更新(Works)
public static MusicManager myInstance;
private boolean songHasChanged;
public MusicManager(MediaplayerUpdateInterface inter) {
this.player = new MediaPlayer();
this.uiUpdateInterface = inter;
executorService.submit(new Runnable() {
@Override
public void run() {
while (true) {
if(songHasChanged) {
uiUpdateInterface.updateUI(10);
songHasChanged = false;
}
if (player.isPlaying()) {
uiUpdateInterface.updateUI(0);
}
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
public static MusicManager getInstance(MediaplayerUpdateInterface inter) {
if (myInstance == null)
return myInstance = new MusicManager(inter);
else
return myInstance;
}Widget代码(有问题?)
public class TrinityWidget extends AppWidgetProvider {
public static boolean needsImage;
public static final int widgetId = 188772;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
updateAppWidget(context, appWidgetManager, appWidgetIds[i]);
}
}
// the below method is where it updates i believe it does work but the updates don't apply until A new widget is created?
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
try {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.trinity_widget);
if (MusicManager.myInstance != null) {
views.setTextViewText(R.id.widgetsongtext, MusicManager.myInstance.getCurrentSongInfo() != null ? MusicManager.myInstance.getCurrentSongInfo().getName() : "Not Playing");
views.setTextViewText(R.id.widgetartisttext, MusicManager.myInstance.getCurrentSongInfo() != null ? MusicManager.myInstance.getCurrentSongInfo().getArtist() : "Not Playing");
} else {
views.setTextViewText(R.id.widgetsongtext, "Not Playing");
views.setTextViewText(R.id.widgetartisttext, "Not Playing");
}
appWidgetManager.updateAppWidget(appWidgetId, views);
}catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onEnabled(Context context) {
}
@Override
public void onDisabled(Context context) {
// Enter relevant functionality for when the last widget is disabled
}
}基本上,在我手动重新创建小部件之前,所有的小部件都不会更新。新的被更新了。
发布于 2015-05-10 21:50:07
问题是由于某种原因我没有更新正确的ID ..。不管是哪种方式,我现在都是基于类更新的。就像下面这样
ComponentName projectWidget = new ComponentName(context, TrinityWidget.class);
appWidgetManager.updateAppWidget(projectWidget, views);https://stackoverflow.com/questions/30147527
复制相似问题