我相信我的问题涉及内存管理。
我的程序是一个匹配的纸牌游戏。我的布局包含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标签。
答案 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。