gpt4 book ai didi

java - 如何有效地更新应用程序小部件

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:48 24 4
gpt4 key购买 nike

我正在开发一个音乐播放器。我想有效地更新小部件并避免 java.lang.IllegalArgumentException: RemoteViews for widget update exceeds maximum bitmap memory usage我的小部件有三个按钮(上一个、播放、下一个)、进度条(显示轨道的当前位置)和 ImageView (显示当前轨道的封面)。问题是我需要经常更新小部件(每秒显示进度)并且我经常得到 IllegalArgumentException。请参阅下面的代码。简要说明:我将小部件 View 存储在全局变量中(为了更好的性能)。 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 我也会收到此错误;

最佳答案

我必须回答我自己的问题。 java.lang.IllegalArgumentException 的原因是静态变量 RemoteViews views 因为当我调用 views.setTextViewText(R.id.text,text)这会将文本放入 RemoteViews 但不会删除之前的文本(RemoteViews 包含我放入他的所有文本)。

如何避免这个问题?您应该每次都创建 RemoteViews 的新实例。

如何提高性能?您应该只将要更改的内容放入 RemoteViews 并调用 wm.partiallyUpdateAppWidget(ids,views);

关于java - 如何有效地更新应用程序小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22116598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com