使用AsyncTask调用Handler。这是好习惯吗?

时间:2016-01-03 12:29:32

标签: java android android-asynctask handler runnable

我想知道我使用的练习是否正确?请看看!

我正在使用AsyncTask调用Handler来动画(逐渐增加)ProgressBar中的进度。

我只能使用Handler为其设置动画,但我需要使用相同的Handler为多个ProgressBars制作动画。我没有发现传递参数的可能性" ProgressBar"对于一个处理程序,也没有声明一个全局变量(可能是数组?)看起来很干净。

所以我将ProgressBar作为参数传递给AsyncTask,然后在AsyncTask中,我定义了Handler,它使用名为publishProgress(int)的AsyncTask方法操作传递的ProgressBar。因此,每次调用AsyncTask实际上都等于为Handler提供一个唯一的传递ProgressBar。

我包含一个显示结构的精简代码:

public class animateProgress extends AsyncTask<ArrayList<ArrayList>, Integer, Boolean> {
    ProgressBar pb;
    int incrementProgress;

    @Override
    protected Boolean doInBackground(ArrayList<ArrayList>... arrayLists) {
        ArrayList<ArrayList> gotArrayList = arrayLists[0]; //get passed arraylist

        ArrayList<ProgressBar> alP = gotArrayList.get(1);
        pb = alP.get(0); // REFERENCE TO PROGRESSBAR IS ACQUIRED HERE.
        scoreCounter.postDelayed(scoreCounterUpdate, 0);
        return null;
    }

    private Handler scoreCounter = new Handler();
    private Runnable scoreCounterUpdate = new Runnable() {
        public void run() {

            if (MY_LOGIC_THAT_PROGRESS_SHOULD_INCREMENT) {
                publishProgress(incrementProgress);

            }
            if (MY_LOGIC_THAT_WE_SHOULD_EXIT) {
                scoreCounter.removeCallbacks(scoreCounterUpdate);
            } else {
                scoreCounter.postDelayed(this, 50);
            }
        }
    };

    @Override
    protected void onProgressUpdate(Integer... values) {
        pb.incrementProgressBy(values[0]);
        super.onProgressUpdate(values);
    }
}

代码完美无缺,但我担心的是我不应该使用AsyncTask或不使用Handler。 另外,我认为doInBackground()理论上应该在我调用scoreCounter.postDelayed()后完成,整个AsyncTask应该也是如此。但实际上,很多秒后由处理程序调用的publishProgress()仍然有效。这很令人困惑。

0 个答案:

没有答案