【问题标题】:Global variable remains unchanged after alteration in methods更改方法后全局变量保持不变
【发布时间】:2017-09-06 12:39:20
【问题描述】:

我目前面临一个小挑战,我无法在更改全局变量 (fileName) 的方法 (startRecording()) 之外获取对其所做的更改。

现在发生的情况:文件名在被 startRecording() 更改后仍然为空

我想要的是:在 userRecordButton 的 onClick 中获取文件名

这看起来像是一个基本问题,但我无法解决,如果能得到一些快速帮助会很有帮助。先感谢您。

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

【问题讨论】:

  • 什么是userRecordButton?你在哪里初始化 userRecordButton?
  • 嗨@Raghavendra,它在getView中初始化
  • 好的,你调试了吗?该行是否正在执行?你在哪里设置值
  • @Raghavendra,是的,我做到了,它在调试时返回 null。该值在 startRecording 方法中被更改。

标签: java android methods onclick global-variables


【解决方案1】:

您有一个全局变量 mFileName,它已设置为 null。然后进入事件处理程序并将一个新的局部变量 whatIsMyFileName 设置为全局变量 null 的值。事件处理程序中的任何时候都不会调用任何会更改局部或全局变量值的方法。

【讨论】:

  • 您好,@James Marshall,首先,感谢您的回复。在我的事件处理程序中,我调用了一个方法 startRecording()。我在 startRecording 方法中更改了 mFileName 的值 3 次。既然 WhatIsMyFileName 初始化代码在 SetDelayedRecord 下面,那不是要把 mFileName 的值从 null 改变吗?
  • 使用上面提供的代码,方法 startRecording() 不会在事件处理程序中调用(检查括号)。
  • 我已经更新了我的解释。希望有帮助。你认为只显示完整的代码是否合适,它很长。
  • 我知道它现在在哪里被调用。这里的问题是这两种方法都没有返回任何东西。检查这个答案:[链接]stackoverflow.com/questions/23887099/…
  • 同意,这是一个很好的解决方案,谢谢。我发布这个问题的主要原因是因为我想知道为什么不直接修改全局变量,因为我的其他一些全局变量(所有布尔值)以相同的方式使用并且我更改了它们的值,这些值显示在 getView 和其他方法。这让我想知道我是否没有使用正确的语法或练习。昨天,我编辑了代码以将信息作为解决方案传递给方法。无论如何,非常感谢你的努力,@Marshall。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多