如何管理记忆?

时间:2017-01-03 11:21:52

标签: android

我相信我的问题涉及内存管理。

我的程序是一个匹配的纸牌游戏。我的布局包含12个ImageView。 我的活动文件有一个 List ImageView属性,它引用了这12个ImageView。 这是在OnCreate方法中完成的,其中我还为ImageViews设置了一个点击监听器。

这是点击侦听器的示例:

private void clickImage(View view){

    ImageView imgV = (ImageView) view;
    imgV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ImageView imgV = (ImageView) v;
            new ShowCardImage().execute(Integer.valueOf(imgV.getTag().toString())-1);
        }
    });

}

ShowCardImage是一个AsyncTask类,单击ImageView后,将显示相应的面部图像。

该程序完美无瑕。当我选择描绘封面图像的图像视图时,它将替换为面部图像。

现在我需要比较所选的每2张牌。我该怎么做? 我自动想到一个 List Integer属性来表示ImageViews的标签。

现在比较两张卡,我应该创建另一个AsyncTask类。 如果是这样,应该在ShowCardImage执行后的监听器中调用它。或者我应该在ShowCardImage类中调用它。如果是,请在doinbackground()onpostexecute()

而且,我目前的代码是否适合内存管理?根据我的理解,每次点击图像时,任务都在后台执行。

因此,假设用户按下card1五次。这是否意味着同时创建了5个单独的后台任务。 List属性的5个相同标记项,用于跟踪用户选择的卡。

当我在ShowCardImage类onProgressUpdate()中更改图像时,确保将图像的setEnabled编程为false可以避免这种情况吗?

或者我必须在doinbackground的开头检查列表整数属性中的第一项和第二项是否相同。如果是这样,什么是防止任务3,4,5,在任务2中删除它时添加card1标签。

1 个答案:

答案 0 :(得分:0)

我设法让我的程序工作。为了比较选定的卡片,我创建了一个名为 DoCardsMatch 的AsyncTask类。我在onPostExecute方法的 ShowCardImage AsyncTask中执行此操作

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        if(selectCards.size() == 2)
            new DoCardsMatch().execute();
    }

我还设法得分。 我创建了一个列表来跟踪每张卡的各个点。 每张卡以20分开始。在DoCardsMatch类中,如果卡不匹配,我从点列表中选定的卡关联位置减去5个点。如果它们匹配,我在DoCardsMatch onPostExecute方法中执行另一个AsyncTask类来设置分数。

    @Override
    protected Void doInBackground(Void... params) {
        //code written here
        if(//cards match)
                  adjustScore = true;
         else //cards don't match
            adjustScore = false;
            }        
    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        if(adjustScore){
            Integer cardPts1 = cardPoints.get(loc.get(0));
            Integer cardPts2 = cardPoints.get(loc.get(1));
            SetScore score = new SetScore();
            score.setScore(false);
            score.execute(cardPts1 + cardPts2);
        }

    }

我想我正在管理记忆。我添加了一个新的游戏按钮。

程序启动时会分配7.65 MB的内存。

玩了3场比赛后,分配的内存现在是8.88 MB。

但是当我按下android监视器中的Initiate GC按钮时。它下降到8.13 MB。

接下来我按下新的游戏按钮,我现在再次按下Initiate GC按钮,它下降到7.38 MB。