Android 移动搜索栏不平滑

Android 移动搜索栏不平滑,android,performance,android-seekbar,Android,Performance,Android Seekbar,我已经完成了Seekbar,并实现了如下源代码: seekProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { adjustCombination(

我已经完成了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时,它并不平滑。那么我如何解决这个问题呢

不要在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();
newasynctask(){
@凌驾
受保护的Void doInBackground(Void…参数){
//您的异步操作
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
//更新UI(这在UI线程上执行)
super.onPostExecute(避免);
}
}.execute();

不要在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();
newasynctask(){
@凌驾
受保护的Void doInBackground(Void…参数){
//您的异步操作
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
//更新UI(这在UI线程上执行)
super.onPostExecute(避免);
}
}.execute();

您可以使用如下异步任务执行后台任务

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);
    }
}
私有类getData扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的字符串背景(字符串…进度){
//使用字符串“progress”执行所需的操作
String value=“hello”+进度;
返回值;
}
@凌驾
受保护的void onPostExecute(字符串progressResult){
//在这条线里你想做什么就做什么
//textview.setText(progressResult)
super.onPostExecute(progressResult);
}
}
因此,PreExecute方法将在后台执行任何任务之前执行,然后将调用doInBackground方法,在调用doInBackground onPostExecute方法后,您将在该方法中获得参数传递,该方法将接收从doInBackground方法返回的结果。我希望你能得到它


您可以像这样使用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);
    }
}
私有类getData扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的字符串背景(字符串…进度){
//使用字符串“progress”执行所需的操作
String value=“hello”+进度;
返回值;
}
@凌驾
受保护的void onPostExecute(字符串progressResult){
//在这条线里你想做什么就做什么
//textview.setText(progressResult)
super.onPostExecute(progressResult);
}
}
因此,PreExecute方法将在后台执行任何任务之前执行,然后将调用doInBackground方法,在调用doInBackground onPostExecute方法后,您将在该方法中获得参数传递,该方法将接收从doInBackground方法返回的结果。我希望你能得到它


如果合适,将计算代码移动到
onStopTrackingTouch()
方法中。这样,当您停止在seekbar上滑动时,它只会被调用一次。

如果合适,请将计算代码移动到
onStopTrackingTouch()
方法中。这样,当您停止在seekbar上滑动时,它将只被调用一次。

如果您正在进行某种计算工作,请将该代码移动到onStopTrackingTouchmethod@DreamInBox这个组合在做什么?这个函数对UI元素有什么作用吗?它进行一些计算并在UI中立即显示值。这就是我将其放在onProgressChanged()上的原因。如果您正在进行某种计算工作,请将该代码移到onStopTrackingTouchmethod@DreamInBox这个组合在做什么?这个函数对UI元素有什么作用吗?它进行一些计算并在UI中立即显示值。这就是我把它放在progresschanged()上的原因。谢谢你的回答。我试着调查并实施,你的解决方案非常有效。谢谢你的回答。我试图调查并实施,您的解决方案效果非常好。谢谢。因为我需要进度值显示在屏幕上,所以它需要不断更新,所以我使用onProgressChanged.Thank。因为我需要进度值显示在屏幕上,所以它需要不断更新,所以我使用onProgressChanged。