我创建了一个示例来处理一个活动,该活动包含一个带有多个进度条的片段,这些进度条由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);
}
答案 0 :(得分:0)
这是Android中的一个已知问题。处理程序只是bug的解决方法