保留片段中的进度条在旋转后失去状态

时间:2017-04-25 18:00:29

标签: android android-asynctask fragment

我创建了一个示例来处理一个活动,该活动包含一个带有多个进度条的片段,这些进度条由AsyncTasks填充,通过调用它们执行executeOnExecutor()来执行。为了支持旋转,片段保留其实例。

奇怪的是,当我在某些任务完成后旋转(并且某些进度条被填满)时,这些进度条变空。我不应该发生因为我从onCreateView()调用的syncSetup方法调用progressbars(cellView.updateProgress)上的setProgress。

在onCreateView中,有一些代码在ui线程上运行syncSetup方法(在注释中),当我这样做时一切正常

为什么这样做会正常工作?据我所知,onCreateView总是在ui线程上调用...

编辑:这不是因为在非ui线程上调用了syncSetup。注释中的代码正常工作,因为runnable直接发布在主线程的messageQueue中。我仍然不知道为什么会有所作为

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    System.out.println("Call to Fragment onCreate");
    setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_async, container, false);

    System.out.println("Call to Fragment onCreateView");
    System.out.println("Got "+tasks.size()+" tasks in list");
    System.out.println("Running? "+isRunning);

    list = (LinearLayout) v.findViewById(R.id.container);
    btnExeDefault = (Button) v.findViewById(R.id.buttonExecuteDefault);
    btnExeParallel  = (Button) v.findViewById(R.id.buttonExecuteParallel);
    btnCancel = (Button) v.findViewById(R.id.buttonCancel);

    btnExeDefault.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            execute(false);
        }
    });
    btnExeParallel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            execute(true);
        }
    });
    btnCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(isRunning){
                isRunning = false;
                for(int i = 0; i < POOL; i++){
                    tasks.get(i).cancel(false);
                    cells.get(i).reset();
                }
                tasks.clear();
                allowExecution(true);
            }
        }
    });

    /*
    new Handler(Looper.getMainLooper()).post((new Runnable()
    {
        @Override
        public void run()
        {
            syncSetup();
        }
    }));
    */
    syncSetup();

    return v;
}

private void syncSetup(){
    cells = new ArrayList<>();
    for(int i = 0; i < POOL; i++){
        CellThread cellView = new CellThread(getContext());
        cellView.setNumber(i);
        list.addView(cellView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        cells.add(cellView);
        if(tasks.size() > i) {
            BasicAsyncTask task = tasks.get(i);
            System.out.println("Manually set task #"+i+" to reflect "+task.getProgress()+"%");
            cellView.updateProgress(task.getProgress());
            tasks.get(i).setUpdateCallback(cellView);
        }
    }
    allowExecution(!isRunning);
}

1 个答案:

答案 0 :(得分:0)

这是Android中的一个已知问题。处理程序只是bug的解决方法

android progressBar does not update progress view/drawable