Java 如何使用OnClick事件关闭线程中运行的inputStream和fileOutputstream

Java 如何使用OnClick事件关闭线程中运行的inputStream和fileOutputstream,java,android,multithreading,media-player,Java,Android,Multithreading,Media Player,我录制了一个来自mPlayer的流,但找不到一种方法如何在单击时停止录制?应该如何查看stopRecord函数? 有什么建议吗 这是我的密码 recordToggle.setOnClickListener(new View.OnClickListener() { Thread recordingThread; InputStream inputStream = null; FileOutputStream bufferedOutpu

我录制了一个来自mPlayer的流,但找不到一种方法如何在单击时停止录制?应该如何查看stopRecord函数? 有什么建议吗

这是我的密码

        recordToggle.setOnClickListener(new View.OnClickListener() {
        Thread recordingThread;
        InputStream inputStream = null;
        FileOutputStream bufferedOutputStream = null;

        private void testMediaBuffer() {
录制应在单独的线程中运行,但Thread.stop已被弃用

            recordingThread = new Thread(new Runnable() {
                public void run() {

                    String outputSource = Environment.getExternalStorageDirectory().getAbsolutePath() + folder + "/my.mp3";
                    try {
                        fos = new FileOutputStream(outputSource);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                    int c;
                    try {


                        URL url = new URL(mPlayer.getDataSource());
                            inputStream = url.openStream();

                            HttpURLConnection con = (HttpURLConnection) url.openConnection();
                            con.setRequestMethod("GET");
                            con.connect();
                            int status = con.getResponseCode();
                            Log.d(TAG, String.valueOf(status));
                            InputStream is = con.getInputStream();
                            int bytesRead = 0;
                            byte[] buf = new byte[1024];
                            try {
                                while ((c = is.read(buf)) != -1) {
                                        Log.d(TAG, " bytesRead=" + bytesRead + " buf: " + Arrays.toString(buf));
                                        try {
                                            fos.write(buf, 0, c);
                                        } catch (IllegalThreadStateException | IOException e) {
                                            e.printStackTrace();
                                        }
                                    fos.flush();
                                    bytesRead++;
                                }is.close();
                            fos.close();
                        } catch (NullPointerException | SocketException e) {
                            e.printStackTrace();
                        }

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });

            recordingThread.start();
        }

        //-- runnable

        private void stopRecord() throws IOException {
            //out.close();
            inputStream.close();
            bufferedOutputStream.close();
            bufferedOutputStream.flush();

        }

        @Override
        public void onClick(View v) { //REC
            if (recordToggle.isEnabled()) {

                if (mPlayer.isPlaying()) {

                    getAlbumStorageDir();
                    testMediaBuffer(); 



                    play.setEnabled(false);

                } else {

                    play.setEnabled(true);
                }
            } else {

                play.setEnabled(true);
                try {
                    stopRecord();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }


        }

    });
这是一个示例代码。 说明: 一个全局变量布尔值,指示在其为真时重新编码。 如果要停止录制,请将变量设置为false。 这将离开while循环。 继续执行线程内的其余代码,并在run()内的代码结束时关闭线程。
在while循环之后,在线程内部关闭流。

您将isRunning放置在何处?它应该位于函数外部的循环头内部,并且在Stop function上,变量isRunning从未使用过。当我将其设置为final时,“isRunning”始终为true。正如您所提到的:首先在recordingThread之前的testMediaBuffer()函数中,然后在循环中,最后在testMediaBuffer()函数中的stopRecord()中,我在while循环中得到一个isRunning错误。变量是从内部类中访问的。需要宣布为最终感谢你你的想法为我节省了很多时间。我只需在onClick事件中设置一个isRunning变量,并按照您的建议在while循环中添加其他变量。O
boolean isRunning = true;


recordingThread = new Thread(new Runnable() {
            public void run() {

                String outputSource = Environment.getExternalStorageDirectory().getAbsolutePath() + folder + "/my.mp3";
                try {
                    fos = new FileOutputStream(outputSource);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                int c;
                try {


                    URL url = new URL(mPlayer.getDataSource());
                        inputStream = url.openStream();

                        HttpURLConnection con = (HttpURLConnection) url.openConnection();
                        con.setRequestMethod("GET");
                        con.connect();
                        int status = con.getResponseCode();
                        Log.d(TAG, String.valueOf(status));
                        InputStream is = con.getInputStream();
                        int bytesRead = 0;
                        byte[] buf = new byte[1024];
                        try {
                            while (isRunning && (c = is.read(buf)) != -1) {
                                    Log.d(TAG, " bytesRead=" + bytesRead + " buf: " + Arrays.toString(buf));
                                    try {
                                        fos.write(buf, 0, c);
                                    } catch (IllegalThreadStateException | IOException e) {
                                        e.printStackTrace();
                                    }
                                fos.flush();
                                bytesRead++;
                            }is.close();
                        fos.close();
                    } catch (NullPointerException | SocketException e) {
                        e.printStackTrace();
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        recordingThread.start();
    }


  public void stopRecording() {
     isRunning = false;
  }