方法改变后全局变量保持不变
我目前正面临一个小挑战,我无法获取对改变它的方法(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
你有一个全局变量,mFileName已被设置为null。然后,您将进入事件处理程序并将新的局部变量whatIsMyFileName设置为全局变量的值null。事件处理程序中的任何一点都不会调用任何会改变本地或全局变量值的方法。
你好,@詹姆斯马歇尔,首先,感谢你的回应。在我的事件处理程序中,我调用了一个方法startRecording()。我在startRecording方法内改变了mFileName的值3次。由于WhatIsMyFileName初始化代码在SetDelayedRecord下面,是否应该从null更改mFileName的值? –
使用上面提供的代码,您的事件处理程序中不会调用startRecording()方法(请检查括号)。 –
我已更新我的解释。希望有所帮助。你认为只显示完整的代码是相当适合的,它相当长的寿命。 –
什么是userRecordButton?你在哪里初始化userRecordButton? – Raghavendra
嗨@Raghavendra,它在getView –
里面初始化好吗,你调试过吗?该线是否正在执行?你在哪里设置值 – Raghavendra