2017-09-06 67 views
-2

我目前正面臨一個小挑戰,我無法獲取對改變它的方法(startRecording())以外的全局變量(fileName)所做的更改。方法改變後全局變量保持不變

現在會發生什麼:爲了獲取文件名userRecordButton的onClick

它看起來像一個基本的問題裏面,但我並不能解決的話,會:文件名通過的startRecording()

我要的是變更後仍無效對獲得一些快速幫助非常有幫助。先謝謝你。

p/s:這只是我認爲相關的部分代碼,如果您需要完整的代碼,請通知我。

代碼

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

什麼是userRecordButton?你在哪裏初始化userRecordButton? – Raghavendra

+0

嗨@Raghavendra,它在getView –

+1

裏面初始化好嗎,你調試過嗎?該線是否正在執行?你在哪裏設置值 – Raghavendra

回答

1

你有一個全局變量,mFileName已被設置爲null。然後,您將進入事件處理程序並將新的局部變量whatIsMyFileName設置爲全局變量的值null。事件處理程序中的任何一點都不會調用任何會改變本地或全局變量值的方法。

+0

你好,@詹姆斯馬歇爾,首先,感謝你的迴應。在我的事件處理程序中,我調用了一個方法startRecording()。我在startRecording方法內改變了mFileName的值3次。由於WhatIsMyFileName初始化代碼在SetDelayedRecord下面,是否應該從null更改mFileName的值? –

+1

使用上面提供的代碼,您的事件處理程序中不會調用startRecording()方法(請檢查括號)。 –

+0

我已更新我的解釋。希望有所幫助。你認爲只顯示完整的代碼是相當適合的,它相當長的壽命。 –