8

My Activity inonCreate()は、時間がかかる長い計算を実行します。

同じように、私は活動の外観を設定するためonCreate()に呼び出します。setContentView()

ポイントは、上記の計算を実行するのに時間がかかるため、アクティビティの画面がロードされるのは久しぶりです。

これを回避する方法について何か提案はありますか?

で呼び出して計算を開始しようとしsetContentView()ましonCreate()onResume()が、アクティビティ画面は最後にのみロードされます。

4

4 に答える 4

21

AsyncTaskなどを使用する以外に方法はありません。その理由は、実際のレンダリングが非同期で行われないためです。つまり、setContentViewは一部のデータのみを設定しますが、その時点では何も表示されません。

ただし、AsyncTaskは、必ずしも「長い」計算を目的としているわけではありません。ただし、アプリが結果に依存していて、他の計算が並行して行われない場合でも、目的を達成するための最も簡単な方法である可能性があります。そうでない場合でも、スレッドを使用する必要がある場合があります。

更新誰もがさまざまな品質のAsyncTaskの回答より多く使用して元のポスターを攻撃し続けているので OPが彼の計算に実際にかかる時間については何も示されていません。また、AsyncTaskは、1回だけ実行できるワンショットのみのオブジェクトです。

考慮すべきもう1つの非常に重要な点は次のとおりです。Androidは、AsyncTaskにバックグラウンドタスクの優先順位を割り当てます。つまり、Androidは、10%のCPUサイクルという人為的な制限でバックグラウンド優先度を持つすべてのタスクを実行するため、低いスケジューリング優先度に加えて、AsyncTaskでの計算はフォアグラウンドで実行された場合の10倍の時間がかかります。ただし、AsyncTasksは、優先度を「少しだけ」上げることで、このグループから除外できます。AsyncTaskの場合、次のように実行されます。

public R doInBackground(I... is) {
    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND +
                              Process.THREAD_PRIORITY_MORE_FAVORABLE);
    ...
}
于 2013-02-10T14:53:03.293 に答える
3

AsyncTaskを実装する必要があります

  public class AsyncTaskActivity extends Activity implements OnClickListener {
    Button btn;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btn = (Button) findViewById(R.id.button1);.
                    //because we implement OnClickListener we only have to pass "this" (much easier)
        btn.setOnClickListener(this);
    }

    public void onClick(View view){
        //detect the view that was "clicked"
        switch(view.getId())
        {
          case R.id.button1:
              new LongOperation().execute("");
          break;

        }

    }

    private class LongOperation extends AsyncTask<String, Void, String> {

          @Override
          protected String doInBackground(String... params) {
                for(int i=0;i<5;i++) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                return "Executed";
          }      

          @Override
          protected void onPostExecute(String result) {
                TextView txt = (TextView) findViewById(R.id.output);
                txt.setText("Executed"); // txt.setText(result);
                //might want to change "executed" for the returned string passed into onPostExecute() but that is upto you
          }

          @Override
          protected void onPreExecute() {
          }

          @Override
          protected void onProgressUpdate(Void... values) {
          }
    }
于 2013-02-10T15:14:04.810 に答える
2

すべての計算の実行に時間がかかる場合、UIは「ロック」され、更新されません。

AsyncTaskですべての長い作業を行う必要があります

AsyncTaskを使用すると、UIスレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作しなくても、バックグラウンド操作を実行してUIスレッドで結果を公開できます。

于 2013-02-10T14:53:05.857 に答える
1

ビューの初期化を開始する前にonCreateメソッドでsetContentView(layoutID)を呼び出し、onCreateメソッドでのみsetContentViewを呼び出した後で、 AsyncTaskを作成し、AsyncTaskスレッドを開始します。以下のようなもの

  onCreate(....){
    --
    --
    setContentView(layoutID);
    ---
    --
    new asynchTask(); // load your ui in AsyncTask by creating an inner class in your activity by extending AsyncTask class

    }

これは、 AsyncTaskを実装する方法のチュートリアルです

于 2013-02-10T14:54:01.473 に答える