我正在开发一款音乐播放器。我希望能够高效地更新小部件并避免出现“java.lang.IllegalArgumentException: RemoteViews for widget update exceeds maximum bitmap memory usage”的错误。 我的小部件有三个按钮(上一首、播放、下一首)、进度条(显示当前曲目的位置)和图像视图(显示当前曲目的封面)。问题在于,我需要经常更新小部件(每秒钟更新一次以显示进度),但经常会出现IllegalArgumentException的异常。 请看下面的代码。简要说明:我将小部件视图存储在全局变量中(以提高性能)。startAlarm() - 启动闹钟管理器以每秒发送广播。 主要问题是如何提高性能并避免IllegalArgumentException异常?
private static RemoteViews views;
@Override
public void onReceive(Context context, Intent intent)
{
super.onReceive(context, intent);
String action = intent.getAction();
AppWidgetManager wm = AppWidgetManager.getInstance(context);
ComponentName cm = new ComponentName(context,SmallBiggerWidget.class);
int[] ids = wm.getAppWidgetIds(cm);
if(ids.length < 1)
return;
if(views == null){
views = getViews(context);
}else if(action.equals(ACTION_TRACK_CHANGED)){
setNewAudioToView(context,views);
setIconPlayToViews(views);
setProgressTotView(views);
}else if(action.equals(ACTION_PAUSE) || action.equals(ACTION_PLAY)){
setIconPlayToViews(views);
}else if(action.equals(ACTION_PROGRESS_UPDATE)){
setProgressTotView(views);
}else if(action.equals(PlayingService.ACTION_RELOAD_IMAGE)){
setNewImageToView(PlayingService.audios.get(PlayingService.indexTrack),context,views);
}
for(int id : ids){
wm.updateAppWidget(id,views);
}
if(isPlaying){
startAlarm(context);
}else{
cancelAlarm(context);
}
}
IllegalArgumentException的原因并不是大封面(我为小尺寸缩放了封面),即使没有imageView,我仍然会遇到这个错误。