2017-07-10 1 views
0

J'ai un ListView qui répertorie les enregistrements audio. Quand je clique sur un pour jouer, il sort l'Internet et récupère l'audio et le joue. Quand il joue le défilement se bloque.MediaPlayer ralentissant listeview

Une fois le MediaPlayer arrêté, je peux faire défiler comme d'habitude. Ce n'est pas un problème de thread car le MediaPlayer joue sur un autre thread.

C'est le MediaPlayer AsyncTask:

private class PlayAudio extends AsyncTask<String, Integer, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     nowPlaying = true; 

     player.setOnErrorListener(new MediaPlayer.OnErrorListener() { 
      @Override 
      public boolean onError(MediaPlayer mp, int what, int extra) { 

       if(isAdded()) { 
        stopAudio(); 
       } 

       PvmUtils.longToast(context, getString(R.string.error_load_msg)); 
       return false; 
      } 
     }); 

     player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       setButtonColors(2); 
      } 
     }); 

     player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 
       stopAudio(); 

       sendPostMessageRead(new Callbacks.SendPostMessageReadCallback() { 
        @Override 
        public void sendPostMessageReadCallback(boolean gotMessageReadResponse) { 
         if (gotMessageReadResponse) { 
          MessageLog message = log.get(listPosition); 
          message.setMessageStatus("read"); 

          if (message.isReply()) { 
           currentMetaTextView.setText(""); 
           MyFcmListenerService.newMessages--; 
           ShortcutBadger.applyCount(context, MyFcmListenerService.newMessages); 
          } 

         } else { 
          Log.d(LOG_TAG, "sendPostMessageReadCallback returned false, error may have occurred"); 
         } 
        } 
       }); 
      } 
     }); 

     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 


     try { 
      //Uri uri = Uri.parse(Keys.getpvmURL() + "android/retrieveMessage?messageId=" + params[0]); 
      //player.setDataSource(params[0].replaceFirst("https","http")); 
      Uri uri = Uri.parse(params[0]); 
      Map<String, String> headers = new HashMap<>(); 
      headers.put("authorisation", encryption.getID().toString()); 
      player.setDataSource(context, uri, headers); 

     } catch (IOException e) { 
      e.printStackTrace(); 
      stopAudio(); 
     } try { 
      player.prepare(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      stopAudio(); 
     } 

     player.start(); 
     return null; 
    } 
} 

C'est le clickListener pour l'élément de liste:

ListAdapter newAdapter = new ListAdapter(getActivity()); 

    if (this.log == null) { 
     list.setAdapter(populateAdapter(newAdapter,new ArrayList<MessageLog>())); 
    } else { 
     list.setAdapter(populateAdapter(newAdapter,log)); 
    } 


    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Log.d(LOG_TAG, Integer.toString(position)); 

      if (log != null && position < log.size()) { 
       if (!nowPlaying && log.get(position).getUrl() != null) { 
        try { 
         stopAudio(); 
         setButtonColors(0, currentPlaying); 

         // Show the play controls. 
         currentPlaying = position; 
         nowPlaying = true; 
         player = new MediaPlayer(); 
         player.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 
         listPosition = position; 
         currentButton = view; 
         Log.d(LOG_TAG, log.get(position).getUrl()); 
         /* 
         MessagePlaybackDialogFragment playFrag = MessagePlaybackDialogFragment.newInstance(log.get(listPosition), 
           new Callbacks.OnPlaybackFinishedListener() { 
          @Override 
          public void onPlaybackDone() { 
           // TODO set as not new 
          } 
         }); 
         playFrag.show(getFragmentManager(), "playFrag");*/ 

//       MessagePlaybackDialogFragment playFrag = MessagePlaybackDialogFragment.newInstance(log.get(listPosition)); 
//       playFrag.show(getFragmentManager(), "playFrag"); 

         currentMetaTextView = (TextView) view.findViewById(R.id.voiceMessageMetaText); 
         currentPlayPauseImageView = (ImageView) view.findViewById(R.id.voiceMessagePlayPauseImage); 
         currentMessageBackground = (RelativeLayout) view.findViewById(R.id.voiceMessageRectangleBackground); 

         setButtonColors(1); 
         currentAudio = new PlayAudio().execute(log.get(listPosition).getUrl()); 
        } catch (Exception e) { 
         stopAudio(); 
         e.printStackTrace(); 
        } 
       } else if (position == listPosition){ 
        stopAudio(); 
       } else if (nowPlaying){ 
        stopAudio(); 

        currentPlaying = position; 
        player = new MediaPlayer(); 
        player.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 
        listPosition = position; 
        currentButton = view; 
        Log.d(LOG_TAG, log.get(position).getUrl()); 
        currentMetaTextView = (TextView) view.findViewById(R.id.voiceMessageMetaText); 
        currentPlayPauseImageView = (ImageView) view.findViewById(R.id.voiceMessagePlayPauseImage); 
        currentMessageBackground = (RelativeLayout) view.findViewById(R.id.voiceMessageRectangleBackground); 

        setButtonColors(0, currentPlaying); 
        setButtonColors(1); 

        currentAudio = new PlayAudio().execute(log.get(listPosition).getUrl()); 
       } 
      } 
     } 
    }); 

Répondre

0

Essayez plutôt prepareAsync, voici mon code ...

mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 
        mp.setDataSource(a.getUrl()); 
        mp.prepareAsync(); 
        mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
         @Override 
         public void onPrepared(MediaPlayer mp) { 
          activityList.get(position).setDuration(mp.getDuration()/1000); 
          holder.playButton.clearAnimation(); 
          mp.start(); 
         } 
        }); 
+0

J'ai essayé ça mais ça n'a pas fait de différence le verrouillage de l'interface utilisateur. –

+0

Étrange, il a résolu le problème pour moi. Je mettrais le code directement dans votre onclickListener plutôt que d'étendre AsyncTask. –