7

私のAndroidアプリは、アクティビティのUIスレッド上にあるため、システムをクラッシュさせ続ける特に大きな計算を採用しています。私はマルチスレッドにほとんど自信がないので、それを正しく行うためのヒントをいくつか入手したいと思います。これは私が持っているものです

class ActivtyName extends Activity{
boolean threadcomplete = false;

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//stuff

Runnable newthread = new Runnable(){

            @Override
            public void run() {
                doBigComputation();
                threadcomplete=true;
            }

        };

        newthread.run();

        boolean b = true;
        while(b){
            if(threadcomplete){
                b=false;
                startTheApp();
            }
        }

}
}

今、私がしたことは「正しく」ないことをかなり確信しています。(ただし、機能しているようです。システムはクラッシュしません)。基本的に、このブール値のthreadcompleteなしで、newthreadが計算を終了したことをUIスレッドにどのように伝えることができるかわかりません。これを行うための「正しい」方法はありますか?

4

4 に答える 4

12

Marek Seberaのコメントを少し拡張するために、AsyncTaskでそれを実現する方法に関するフレームワークを次に示します。

private class BigComputationTask extends AsyncTask<Void, Void, Void> {

  @Override
  protected void onPreExecute() {
    // Runs on UI thread
    Log.d(TAG, "About to start...");
  }

  @Override
  protected Void doInBackground(Void... params) {
    // Runs on the background thread
    doBigComputation();
  }

  @Override
  protected void onPostExecute(Void res) {
    // Runs on the UI thread
    Log.d(TAG, "Big computation finished");
    startTheApp();
  }

}

そしてそれを呼ぶために:

BigComputationTask t = new BigComputationTask();
t.execute();
于 2012-01-01T15:41:41.703 に答える
2

マーヴィンの答えに加えて、これについての良い記事がAndroid開発者サイトにあります。

于 2012-01-01T16:22:18.370 に答える
1

これは、スレッドを開始する正しい方法ではありません。あなたがする必要があります:

    Runnable newthread = new Runnable(){

        @Override
        public void run() {
            doBigComputation();
            threadcomplete=true;
        }

    };

    Thread t = new Thread(newthread);
    newthread.start();

    boolean b = true;
    while(b){
        if(threadcomplete){
            b=false;
            startTheApp();
        }
    }
于 2012-01-01T21:22:50.160 に答える
-2

スレッドを使用したいときは、ほとんど大きなwhileループがあります。停止したい場合を除いて、常に真であるブール条件を設定します。

Thread(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html)を使用していますが、廃止されたため、stopメソッドを再実装します。したがって、stopメソッドでは、ループ変数にfalse値を設定できます。

スレッドを終了するには、t.stop()を使用します。だからあなたはあなたの活動の中でそれを死ぬことができます。

Theadがいつ停止するかを知りたい場合は、t.isAlive()を使用できます。スレッドtが開始されると、isAliveはtrueを返します。

于 2012-01-01T15:28:10.173 に答える