Java 在创建类的实例之前,如何使用实例方法?
我有以下代码:Java 在创建类的实例之前,如何使用实例方法?,java,android,instance,instance-methods,Java,Android,Instance,Instance Methods,我有以下代码: public class NumbersFragment extends Fragment { /** Handles playback of all the sound files */ private MediaPlayer mMediaPlayer; private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListen
public class NumbersFragment extends Fragment {
/** Handles playback of all the sound files */
private MediaPlayer mMediaPlayer;
private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
// Now that the sound file has finished playing, release the media player resources.
releaseMediaPlayer();
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.word_list, container, false);
// Create a list of words
final ArrayList<Word> words = new ArrayList<Word>();
words.add(new Word(R.string.number_one,
R.drawable.number_one, R.raw.number_one));
words.add(new Word(R.string.number_two,
R.drawable.number_two, R.raw.number_two));
words.add(new Word(R.string.number_three,
R.drawable.number_three, R.raw.number_three));
words.add(new Word(R.string.number_four,
R.drawable.number_four, R.raw.number_four));
words.add(new Word(R.string.number_five,
R.drawable.number_five, R.raw.number_five));
words.add(new Word(R.string.number_six,
R.drawable.number_six, R.raw.number_six));
words.add(new Word(R.string.number_seven,
R.drawable.number_seven, R.raw.number_seven));
words.add(new Word(R.string.number_eight,
R.drawable.number_eight, R.raw.number_eight));
words.add(new Word(R.string.number_nine,
R.drawable.number_nine, R.raw.number_nine));
words.add(new Word(R.string.number_ten,
R.drawable.number_ten, R.raw.number_ten));
// Create an {@link WordAdapter}, whose data source is a list of {@link Word}s. The
// adapter knows how to create list items for each item in the list.
WordAdapter adapter = new WordAdapter(getActivity(), words, R.color.category_numbers);
// Find the {@link ListView} object in the view hierarchy of the {@link Activity}.
// There should be a {@link ListView} with the view ID called list, which is declared in the
// word_list.xml layout file.
ListView listView = (ListView) rootView.findViewById(R.id.list);
// Make the {@link ListView} use the {@link WordAdapter} we created above, so that the
// {@link ListView} will display list items for each {@link Word} in the list.
listView.setAdapter(adapter);
// Set a click listener to play the audio when the list item is clicked on
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
// Release the media player if it currently exists because we are about to
// play a different sound file
releaseMediaPlayer();
// Get the {@link Word} object at the given position the user clicked on
Word word = words.get(position);
// Create and setup the {@link MediaPlayer} for the audio resource associated
// with the current word
mMediaPlayer = MediaPlayer.create(getActivity(), word.getAudioResourceId());
// Start the audio file
mMediaPlayer.start();
// Setup a listener on the media player, so that we can stop and release the
// media player once the sound has finished playing.
mMediaPlayer.setOnCompletionListener(mCompletionListener);
}
}
});
return rootView;
}
private void releaseMediaPlayer() {
// If the media player is not null, then it may be currently playing a sound.
if (mMediaPlayer != null) {
// Regardless of the current state of the media player, release its resources
// because we no longer need it.
mMediaPlayer.release();
// Set the media player back to null. For our code, we've decided that
// setting the media player to null is an easy way to tell that the media player
// is not configured to play an audio file at the moment.
mMediaPlayer = null;
// Regardless of whether or not we were granted audio focus, abandon it. This also
// unregisters the AudioFocusChangeListener so we don't get anymore callbacks.
mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener);
}
}
公共类NumbersFragment扩展片段{
/**处理所有声音文件的播放*/
私有媒体层;
私有MediaPlayer.OnCompletionListener MCCompletionListener=新MediaPlayer.OnCompletionListener(){
@凌驾
完成时的公共作废(MediaPlayer MediaPlayer){
//现在声音文件已经播放完毕,释放媒体播放器资源。
释放MediaPlayer();
}
};
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.word\u列表,容器,false);
//创建一个单词列表
最终ArrayList单词=新ArrayList();
添加新词(R.string.number_-one,
R.drawable.number_-one,R.raw.number_-one);
添加新词(R.string.number_二,
R.drawable.number_-two,R.raw.number_-two);
添加新词(R.string.number_三,
R.drawable.number_三,R.raw.number_三);
添加新词(R.string.number_-four,
R.drawable.number_-four,R.raw.number_-four);
添加新词(R.string.number_五、,
R.drawable.number_-five,R.raw.number_-five);
添加新词(R.string.number_六,
R.drawable.number_六,R.raw.number_六);
添加新词(R.string.number_七,
R.drawable.number_-seven,R.raw.number_-seven);
words.add(新词)(R.string.number_八,
R.drawable.number_八,R.raw.number_八);
添加新词(R.string.number_九、,
R.drawable.number_-nine,R.raw.number_-nine);
添加新词(R.string.number_十、,
R.drawable.number_-ten,R.raw.number_-ten);
//创建一个{@link WordAdapter},其数据源是{@link Word}的列表
//适配器知道如何为列表中的每个项创建列表项。
WordAdapter=新的WordAdapter(getActivity(),words,R.color.category_number);
//在{@link Activity}的视图层次结构中查找{@link ListView}对象。
//应该有一个{@link ListView},其视图ID为list,在
//word_list.xml布局文件。
ListView ListView=(ListView)rootView.findViewById(R.id.list);
//使{@link ListView}使用我们在上面创建的{@link WordAdapter},以便
//{@link ListView}将显示列表中每个{@link Word}的列表项。
setAdapter(适配器);
//设置单击侦听器,以便在单击列表项时播放音频
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
公共虚线单击(AdapterView AdapterView,视图视图,内部位置,长l){
//如果媒体播放器当前存在,请释放它,因为我们即将
//播放不同的声音文件
释放MediaPlayer();
//在用户单击的给定位置获取{@link Word}对象
Word=words.get(位置);
//为关联的音频资源创建并设置{@link MediaPlayer}
//用现在的词
mMediaPlayer=MediaPlayer.create(getActivity(),word.getAudioResourceId());
//启动音频文件
mmediplayer.start();
//在媒体播放器上设置一个侦听器,以便我们可以停止并释放
//播放完声音后,使用媒体播放器。
mmediplayer.setOnCompletionListener(mcCompletionListener);
}
}
});
返回rootView;
}
私有void releaseMediaPlayer(){
//如果媒体播放器不为空,则它当前可能正在播放声音。
if(mmediplayer!=null){
//无论媒体播放器的当前状态如何,请释放其资源
//因为我们不再需要它了。
mmediplayer.release();
//将媒体播放器设置回null。对于我们的代码,我们决定
//将媒体播放器设置为null是判断媒体播放器
//当前未配置为播放音频文件。
mmediplayer=null;
//不管我们是否被授予音频聚焦,放弃它。这也是
//注销AudioFocusChangeListener,这样我们就不会再收到回调。
mAudioManager.AudioFocus(mOnAudioFocusChangeListener);
}
}
如果您查看上面的代码,您会注意到有一个
releaseMediaPlayer()
方法,在创建MediaPlayer
类的实例之前,我在这个方法中调用了mMediaPlayer.release()
,代码工作没有错误,那么,在从您的代码中创建类的实例之前,如何调用实例方法呢???,您可以检查MMEDIPLAYER!=无效的如果您没有mediaplayer实例,那么如果条件和mMediaPlayer.release()不执行,您将不会通过
private void releaseMediaPlayer() {
// If the media player is not null, then it may be currently playing a sound.
if (mMediaPlayer != null) {
// Regardless of the current state of the media player, release its resources
// because we no longer need it.
mMediaPlayer.release();
// Set the media player back to null. For our code, we've decided that
// setting the media player to null is an easy way to tell that the media player
// is not configured to play an audio file at the moment.
mMediaPlayer = null;
// Regardless of whether or not we were granted audio focus, abandon it. This also
// unregisters the AudioFocusChangeListener so we don't get anymore callbacks.
mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener);
}
您有一个
null
检查。即使在您调用releaseMediaPlayer()
时未创建mMediaPlayer
,它也不会崩溃,因为不会调用mMediaPlayer.release()
。没有代码工作,也没有任何错误或问题,因此如何调用release();方法,即使没有实例,例如,如果我想调用TextView类中的setText()方法,我应该先在引用变量中保留TextView的引用,然后才能使用它的方法,但在我的示例中,即使mMediaPlayer=null,我也可以调用MediaPlaye