2016-08-16 7 views
1

スクリプトに.release()メソッドを追加してアンドロイドエミュレータを実行しましたが、アンドロイドモニタを表示してtextviews再生音。アンドロイドモニタグラフを表示しているときに.release()がメモリを節約しません

サウンドが終了してもメモリが解放されませんでしたが、どうしたのですか?

package com.example.android.miwok; 

import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 

import java.util.ArrayList; 

public class NumbersActivity extends AppCompatActivity { 

private MediaPlayer mMediaPlayer; 

private MediaPlayer.OnCompletionListener mCompletionListerner = new MediaPlayer.OnCompletionListener() { 
    @Override 
    public void onCompletion(MediaPlayer mediaPlayer) { 
     releaseMediaPlayer(); 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.word_list); 

    final ArrayList<Word> words = new ArrayList<>(); // <-- Creates list 

    words.add(new Word("one", "lutti", R.raw.number_one, R.drawable.number_one)); 
    words.add(new Word("two", "otiiko", R.raw.number_two, R.drawable.number_two)); 
    words.add(new Word("three", "tolookosu", R.raw.number_three, R.drawable.number_three)); 
    words.add(new Word("four", "oyyisa", R.raw.number_four, R.drawable.number_four)); 
    words.add(new Word("five", "massokka", R.raw.number_five, R.drawable.number_five)); 
    words.add(new Word("six", "temmokka", R.raw.number_six, R.drawable.number_six)); 
    words.add(new Word("seven", "kenekaku", R.raw.number_seven, R.drawable.number_seven)); 
    words.add(new Word("eight", "kawinta", R.raw.number_eight, R.drawable.number_eight)); 
    words.add(new Word("nine", "wo'e", R.raw.number_nine, R.drawable.number_nine)); 
    words.add(new Word("ten", "na'aacha", R.raw.number_ten, R.drawable.number_ten)); 

    WordAdapter adapter = new WordAdapter(this, words, R.color.category_numbers); 


    ListView listView = (ListView) findViewById(R.id.list);  // <-- id the Listview 
    listView.setAdapter(adapter); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
      releaseMediaPlayer(); 
      Word word = words.get(position); 
      mMediaPlayer = MediaPlayer.create(NumbersActivity.this, word.getAudioResourceId()); 
      mMediaPlayer.start(); 
      mMediaPlayer.setOnCompletionListener(mCompletionListerner); 
     } 
    }); 
} 

private void releaseMediaPlayer() { 
    if (mMediaPlayer != null) { 
     mMediaPlayer.release(); 
     mMediaPlayer = null; 
    } 
} 
} 

答えて

1

Android(より一般的にはJava)はGarbage Collectorシステムを使用します。

このコレクターは空きメモリを即座に「収集」しません。あなたはが通過するタイミングを正確に判断できません。したがって、あなたが.release()オブジェクトなどを取得したときに、GCが来ると判断するまで待つ必要があります。参照を解放

それがすべてだ...このオブジェクトがガベージコレクトすることができGCに伝えるためにのみ効果があります。)

だから、あなたの質問に答える:あなたは、あなただけの、何も悪いことを行っていませんGCを待つ必要があります。

関連する問題