サンプルを作成し、executeOnExecutor()を呼び出して実行されるAsyncTasksで埋め込まれた複数のプログレスバーを含むフラグメントを含むアクティビティを再生しました。回転をサポートするために、フラグメントはそのインスタンスを保持します。保持されたフラグメント内のプログレスバーは、回転後に状態が失われます。
奇妙なことは、いくつかのタスクが完了した後に回転すると(いくつかのプログレスバーがいっぱいになる)、これらのプログレスバーは空になります。私は、onCreateView()から呼び出されたsyncSetupメソッドからのprogressbars(cellView.updateProgress)でsetProgressを呼び出すので、私は起こるべきではありません。私はこのすべてが正しく
の作品ないときそれを行う際にonCreateViewで
は、(コメントで)UIスレッド上でsyncSetup方法を実行するためのいくつかのコードがあると、なぜそれが正常に動作しますか?私の知識では、onCreateViewは常にUIスレッドで呼び出されます。
EDIT:これはsyncSetupが非UIスレッドで呼び出されたためではありません。 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);
}