2017-04-25 7 views
0

サンプルを作成し、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); 
} 

答えて

関連する問題