2016-12-05 3 views
-2

나는이 코드를 가지고 :클래스 인스턴스를 생성하기 전에 인스턴스 메소드를 어떻게 사용할 수 있습니까?

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); 
     } 
    } 

전에 내가 releaseMediaPlayer()라고 MediaPlayer 클래스의 인스턴스를 생성하고 코드가 작동, 당신은 releaseMediaPlayer() 방법이 있음을 참고하고이 방법 안에 내가 mMediaPlayer.release()이라고 위에 당신은 코드를 살펴있는 경우 오류가 없으므로 클래스의 인스턴스를 만들기 전에 인스턴스 메서드를 호출하여이 작업을 수행 할 수 있습니까?

+0

당신은'null' 확인을했습니다. 'releaseMediaPlayer()'를 호출 할 때'mMediaPlaer'가 생성되지 않더라도'mMediaPlayer.release()'가 호출되지 않기 때문에 충돌하지 않습니다. –

+0

코드 작업이없고 아무런 오류나 문제가 없습니다. –

답변

1

코드에서 mMediaplayer! = null인지 확인합니다. mediaplayer의 인스턴스가 없으면 condition과 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); 
    } 
+0

그래서 어떻게 release()를 호출 할 수 있습니까? 메서드는 심지어 인스턴스가 없습니다, 예를 들어 내가 TextView 클래스에서 setText() 메서드를 호출하려면 원하는 참조 변수에 TextView 참조를 보유해야합니다 전에 그것을 사용하지만, 내 예제에서는 mMediaPlayer = null MediaPlayer 메서드를 호출 할 수 있습니다 여기에 어떤 무늬가 있니? –

+0

귀하의 코드 : if (mMediaPlayer! = null) { – Orbite

+0

예, 경고 해 주셔서 감사합니다. 그러나 위의 질문에 답하십시오. –

관련 문제