【问题标题】:Progressbars in retained fragment lose state after rotation保留片段中的进度条在旋转后丢失状态
【发布时间】:2017-04-25 18:00:29
【问题描述】:

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

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

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

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

编辑:这不是因为在非 ui 线程上调用了 syncSetup。 cmets中的代码可以正常工作,因为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);
}

【问题讨论】:

    标签: android android-asynctask fragment


    【解决方案1】:

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

    android progressBar does not update progress view/drawable

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 2013-11-30
      • 2011-04-04
      • 1970-01-01
      • 2017-02-04
      • 2016-01-04
      相关资源
      最近更新 更多