Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用AsyncTask调用处理程序。这是好的做法吗?_Java_Android_Android Asynctask_Handler_Runnable - Fatal编程技术网

Java 使用AsyncTask调用处理程序。这是好的做法吗?

Java 使用AsyncTask调用处理程序。这是好的做法吗?,java,android,android-asynctask,handler,runnable,Java,Android,Android Asynctask,Handler,Runnable,我想知道我正在使用的练习是否正确?请看一看 我使用AsyncTask调用一个处理程序来设置进度条中进度的动画(随时间逐渐递增) 我只能使用处理程序设置动画,但我需要使用同一个处理程序设置多个ProgressBar的动画。我发现不可能将参数“ProgressBar”传递给处理程序,声明全局变量(可能是数组?)看起来也不干净 因此,我将ProgressBar作为参数传递到AsyncTask中,然后在AsyncTask中,我定义了处理程序,该处理程序使用名为publishProgress(int)的A

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

我使用AsyncTask调用一个处理程序来设置进度条中进度的动画(随时间逐渐递增)

我只能使用处理程序设置动画,但我需要使用同一个处理程序设置多个ProgressBar的动画。我发现不可能将参数“ProgressBar”传递给处理程序,声明全局变量(可能是数组?)看起来也不干净

因此,我将ProgressBar作为参数传递到AsyncTask中,然后在AsyncTask中,我定义了处理程序,该处理程序使用名为publishProgress(int)的AsyncTask方法操纵传递的ProgressBar。因此,对AsyncTask的每次调用实际上等同于为处理程序提供一个唯一传递的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);
    }
}
public类animateProgress扩展异步任务{
ProgressBar-pb;
整数递增进度;
@凌驾
受保护的布尔doInBackground(ArrayList…ArrayList){
ArrayList gotArrayList=arrayLists[0];//通过ArrayList
ArrayList alP=gotArrayList.get(1);
pb=alP.get(0);//此处获取对PROGRESSBAR的引用。
scoreCounter.postDelayed(scoreCounterUpdate,0);
返回null;
}
私有处理程序scoreCounter=新处理程序();
private Runnable scoreCounterUpdate=new Runnable(){
公开募捐{
如果(我的逻辑,即进度,应增加){
出版进度(递增进度);
}
如果(我的逻辑是我们应该退出){
scoreCounter.removeCallbacks(scoreCounterUpdate);
}否则{
计分器。延迟后(本,50);
}
}
};
@凌驾
受保护的void onProgressUpdate(整型…值){
pb.incrementProgressBy(值[0]);
super.onProgressUpdate(值);
}
}
代码工作得很好,但我担心的是,我不应该使用AsyncTask,也不应该使用Handler。 另外,我认为doInBackground()理论上应该在调用scoreCounter.postDelayed()后立即完成,整个异步任务也应该完成。但实际上,处理程序在几秒钟后调用的publishProgress()仍然有效。这令人困惑