移动搜索栏不流畅

时间:2018-08-13 08:35:32

标签: android performance android-seekbar

我有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时,它并不平滑。那么我该如何解决该问题?

3 个答案:

答案 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()方法移动计算代码。这样,当您停止在搜索栏上滑动时,它只会被调用一次。