2017-09-06 4 views
-2

Je suis actuellement confrontée à un problème mineur où je ne peux pas obtenir les modifications apportées à la variable globale (nomfichier) en dehors de la méthode qui l'a modifiée (startRecording()).La variable globale reste inchangée après modification dans les méthodes

Ce qui se passe maintenant: fileName reste nulle après modification par StartRecording()

Ce que je veux est: Acquérir fileName à l'intérieur onClick

de userRecordButton Il ressemble à un problème fondamental, mais je ne peux pas le résoudre, sera être si utile pour obtenir de l'aide rapide. Merci d'avance. P/s: Ceci est juste des parties du code que je sens pertinent, s'il vous plaît informez-moi si vous auriez besoin du code complet.

code

public class WordAdapter extends ArrayAdapter<Word> { 
public String mFileName = null; 

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

final Button userRecordButton = (Button)listItemView.findViewById(R.id.recordButton); 

userRecordButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) {  
        if (!isRecording) { 
         userRecordButton.setText("Ready?"); 
         Handler delayRecord = new Handler(); 
         //This is where i called the handler 
         setDelayedRecord(delayRecord, userPlayButton, userRecordButton); 

      //The issue is here: it shows null when i tried debugging 
         String whatIsMyFileName = mFileName; 

         Handler maximumRecord = new Handler(); 
         setMaximumRecord(maximumRecord, userPlayButton, userRecordButton); 
        } else { 
         exeStopRecording(userPlayButton, userRecordButton); 
        } 
       } 
      } 
     }); 

} //End of getView 

    public void setDelayedRecord(Handler handler, final Button userPlayBtnReference, final Button userRecordBtnReference) { 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        //James!, this is where I called start recorder. 
        startRecording(); 
        userPlayBtnReference.setEnabled(false); 
       } catch (IllegalStateException e) { 
        Log.d("Hello", "Problem in start recording", e); 
       } 
       userRecordBtnReference.setText("Stop"); 
       Toast.makeText(mContext, "Started Recording", Toast.LENGTH_SHORT).show(); 
       setPathName(mFileName); 
      } 
     }, 500); 
    } 

private void startRecording() { 

     mFile = new File(Environment.getExternalStorageDirectory(), mFolder_main); 
     if (!mFile.exists()) { 
      mFile.mkdirs(); 
     } 

     formatter = new SimpleDateFormat("yyMMdd'-'HHmmssSSS"); 
     currentTime_1 = new Date(); 
     dateString = formatter.format(currentTime_1); 
     uniqueName = "Pronunce-" + dateString + ".3gp"; 
     mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
     mFileName += "/" + mFolder_main + "/" + uniqueName; 
    //mFileName should no longer be null  

     mRecorder = new MediaRecorder(); 
     mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     mRecorder.setOutputFile(mFileName); 
     mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

     try { 
      mRecorder.prepare(); 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "prepare() failed"); 
     } 
     isRecording = true; 
     mRecorder.start(); 
    } 

}//End of wordAdapter 
+1

Qu'est-ce que userRecordButton? où avez-vous initialisé userRecordButton? – Raghavendra

+0

Salut @Raghavendra, il est initialisé dans getView –

+1

okay, avez-vous debug? si cette ligne est en cours d'exécution ou non? Où définir la valeur – Raghavendra

Répondre

1

Vous avez une variable globale, mFileName qui a été défini sur null. Vous vous déplacez ensuite dans le gestionnaire d'événements et définissez une nouvelle variable locale, whatIsMyFileName à la valeur de la variable globale, null. À aucun moment dans le gestionnaire d'événements, n'appelez de méthode qui modifierait la valeur de la variable locale ou globale.

+0

Bonjour, @ James Marshall, tout d'abord, merci d'avoir répondu. Dans mon gestionnaire d'événements, j'ai appelé une méthode startRecording(). J'ai modifié la valeur de mFileName 3 fois dans la méthode startRecording. Puisque le code d'initialisation WhatIsMyFileName est au-dessous de SetDelayedRecord, n'est-ce pas supposé changer la valeur de mFileName de null? –

+1

Avec le code que vous avez fourni ci-dessus, la méthode startRecording() n'est pas appelée dans votre gestionnaire d'événements (vérifiez vos parenthèses). –

+0

J'ai mis à jour mon explication. J'espère que cela pourra aider. Pensez-vous qu'il serait approprié de montrer le code complet, c'est assez long. –