2017-01-03 2 views
0

私は私の質問がメモリ管理を扱うと信じています。メモリを管理するには?

私のプログラムは、一致するカードゲームです。私のレイアウトは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はImageViewのをクリックすると、該当する顔画像が表示されますAsyncTaskクラスです。

プログラムはそのまま動作します。カバー画像を描いた画像ビューを選択すると、顔画像に置き換えられます。

ここでは、選択された2枚のカードを比較する必要があります。これについてどうすればいいですか? 私は自動的にImageViewsのタグを表すのList Integerプロパティを考えています。

ここで2枚のカードを比較すると、別のAsyncTaskクラスを作成する必要があります。 もしそうなら、それはShowCardImageの実行後にリスナー内で呼び出されるべきです。または私はShowCardImageクラスで呼び出す必要があります。その場合は、doinbackground()またはonpostexecute()にあります。

また、現在のコードはメモリ管理に適していますか?私の理解から、イメージがクリックされるたびに、タスクはバックグラウンドで実行されます。

したがって、ユーザーがcard1を5回押すと言うことができます。これは、5つの別々のバックグラウンドタスクが同時に作成されることを意味しますか?ユーザーが選択したカードを追跡するListプロパティの同じタグの5つのアイテム。

これは、ShowCardImageクラスのonProgressUpdate()で画像を変更すると、画像のsetEnabledをfalseに設定することで回避できますか?

または私は一覧Integer型のプロパティの項目1と2ということをチェックしなければならないのは、doinbackgroundの初めに同じです。もしそうなら、タスク3,4,5の中で、タスク2の間にcard1タグを削除するときに、それを追加するのは何でしょうか。

答えて

0

私のプログラムを動作させることができました。選択したカードを比較するには、DoCardsMatchという名前のAsyncTaskクラスを作成しました。私はまた、スコアを設定するために管理

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

onPostExecute方法で私のShowCardImage AsyncTaskでこれを実行します。 各カードの個々のポイントを記録するリストを作成しました。 各カードは20ポイントで始まります。 DoCardsMatchクラスでは、カードが一致しない場合、ポイントリスト内の選択されたカード関連の位置から5点を減算します。一致する場合は、別のAsyncTaskクラスをDoCardsMatch onPostExecuteメソッドで実行してスコアを設定します。

@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.88MBになりました。

しかし、私はアンドロイドモニターで[開始GC]ボタンを押します。それは8.13 MBにまで下がります。

次に、新しいゲームボタンを押して、もう一度[Initiate GC]ボタンを押すと、7.38 MBに下がります。