我有Seekbar,并且实现了以下源代码:
seekProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
adjustCombination(progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
因为函数:adjustCombination(progress)需要0.2秒才能完成执行,所以当我移动Seekbar时,它并不平滑。那么我该如何解决该问题?
答案 0 :(得分:2)
您可以使用AsyncTask这样执行后台任务,
seekProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
new getData().execute(progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
现在,您必须定义getData()来执行并传递所需的参数。在您的情况下,我们必须通过进度
private class getData extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... progress) {
// perform operation you want with String "progress"
String value = "hello" + progress;
return value;
}
@Override
protected void onPostExecute(String progressResult) {
// do whatever you want in this thread like
// textview.setText(progressResult)
super.onPostExecute(progressResult);
}
}
因此,PreExecute方法将在后台执行任何任务之前执行,然后将调用doInBackground方法,并且在调用doInBackground onPostExecute方法之后,您将在此方法中传递参数,该方法将接收从doInBackground方法返回的结果。希望您能理解。
答案 1 :(得分:1)
请勿在UI线程上执行此操作。改用后台线程,并处理回调。然后根据需要在UI线程上更新您的UI。
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
// your async action
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
// update the UI (this is executed on UI thread)
super.onPostExecute(aVoid);
}
}.execute();
答案 2 :(得分:0)
如果合适,请使用onStopTrackingTouch()
方法移动计算代码。这样,当您停止在搜索栏上滑动时,它只会被调用一次。