Java 如何使用OnClick事件关闭线程中运行的inputStream和fileOutputstream
我录制了一个来自mPlayer的流,但找不到一种方法如何在单击时停止录制?应该如何查看stopRecord函数? 有什么建议吗 这是我的密码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
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;
}