如何高效更新应用程序小部件

3

我正在开发一款音乐播放器。我希望能够高效地更新小部件并避免出现“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,我仍然会遇到这个错误。

1个回答

4

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

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

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


我在设置RemoteImageView的位图时遇到了同样的问题,查看源代码后发现RemoteView有一个BitmapCache,它不断增长...感谢您的提示! - Decoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接