progressBar.setOnSeekBarChangeListener
时间: 2023-10-06 22:05:15 浏览: 147
这段代码用于给 ProgressBar 组件设置一个 SeekBarChangeListener 监听器。SeekBarChangeListener 是一个接口,它包含了三个回调方法,分别是 onProgressChanged()、onStartTrackingTouch() 和 onStopTrackingTouch()。当用户对 ProgressBar 进行操作时,如拖动进度条,这些方法会被调用,开发者可以在这些方法中执行相应的操作,如更新进度条的进度,或者在进度条开始被拖动时暂停播放等。需要注意的是,该方法需要传入一个实现了 SeekBarChangeListener 接口的对象,或者使用匿名内部类来实现该接口。
相关问题
handler.post(new Runnable() { @Override public void run() { SeekBar progressBar = findViewById(R.id.progressBar); progressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 计算百分比对应的数字 int number = progress * 10; // 在 UI 线程中更新 ProgressBar 的进度 handler.post(new Runnable() { @Override public void run() { seekBar.setProgress(progress); } }); out.println(number); }出现 at com.example.rlswj.MainActivity$ConnectTask$1.onProgressChanged(MainActivity.java:83) at android.widget.SeekBar.onProgressRefresh(SeekBar.java:99) at android.widget.ProgressBar.doRefreshProgress(ProgressBar.java:1577) at android.widget.ProgressBar.refreshProgress(ProgressBar.java:1686) at android.widget.ProgressBar.setProgressInternal(ProgressBar.java:1752) at android.widget.AbsSeekBar.trackTouchEvent(AbsSeekBar.java:1016) at android.widget.AbsSeekBar.startDrag(AbsSeekBar.java:971) at android.widget.AbsSeekBar.onTouchEvent(AbsSeekBar.java:928)
这段代码是一个Android应用程序中的异常堆栈信息,其中包含了错误的位置和错误类型等信息。从异常堆栈中可以看出,异常出现在MainActivity.java文件的ConnectTask内部的1号子类的onProgressChanged()方法中。出现异常的原因是在SeekBar控件的进度值改变时,通过handler.post()方法在UI线程中更新SeekBar的进度值,但是在更新进度值时使用了参数progress而不是变量number,导致进度值没有被正确更新。具体的错误原因需要查看代码来确定,但是可以通过异常信息的提示来排查问题所在。
@Override public void onClick(View v) { String ip = ipEditText.getText().toString(); int port = Integer.parseInt(portEditText.getText().toString()); new Thread(new Runnable() { @Override public void run() { try { socket = new Socket(ip, port); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); // 获取SeekBar对象 SeekBar progressBar = findViewById(R.id.progressBar); // 添加OnSeekBarChangeListener监听器 progressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 计算百分比对应的数字 int number = progress * 10; out.println(number); } @Override public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onStopTrackingTouch(SeekBar seekBar) {} }); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start();这段代码主线程中设计网络的传输,能帮我移到子线程中吗
是的,这段代码中的网络传输操作是在主线程中进行的,如果需要将其移到子线程中,可以将网络传输操作放在新的线程中执行。可以将上面的代码块修改如下:
```
@Override
public void onClick(View v) {
String ip = ipEditText.getText().toString();
int port = Integer.parseInt(portEditText.getText().toString());
new Thread(new Runnable() {
@Override
public void run() {
try {
socket = new Socket(ip, port);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
// 获取SeekBar对象
SeekBar progressBar = findViewById(R.id.progressBar);
// 添加OnSeekBarChangeListener监听器
progressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// 计算百分比对应的数字
int number = progress * 10;
new Thread(new Runnable() {
@Override
public void run() {
out.println(number);
}
}).start();
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
}
```
将网络传输操作的代码放在新的线程中执行,SeekBar 的监听器也放在主线程中执行,这样就可以避免在主线程中进行网络传输造成的阻塞问题。
阅读全文