2012-01-01 2 views
7

私のAndroidアプリは、アクティビティのUIスレッド上にあるため、システムをクラッシュさせる非常に大きな計算を採用しています。 私はマルチスレッドにはほとんど自信がないので、正しく行う方法についていくつかのヒントを得たいと思います。 これは私が「正しい」ではありません、私がやっていることはかなり確信して、私は今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(); 
      } 
     } 

} 
} 

を持っているものです。 (それは動作するようですが、システムはクラッシュしません)。基本的には、newthreadがこのブール値なしで計算を完了したことをUIスレッドがどのように伝えることができるのかよくわかりません、threadcomplete。これを行うには "正しい"方法がありますか?

+0

は忙しい、スレッドを待つ参加しませんを使用して、AsyncTaskの表情を取るhttp://developer.android.com/reference/android/os/AsyncTask.html –

答えて

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(); 
-2

私はスレッドを使用したいとき、私はほとんど大きなwhileループをしました。私はそれを止めたいときを除いて常に真であるブール条件を付けます。

スレッド(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html)を使用しています。非推奨になっているため、stopメソッドを再実装します。だから私の停止方法では、私はループ変数に偽の値を置くことができます。

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

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

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(); 
     } 
    } 
+2

あなたがやっているように待ってください。 http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html – odiggity

関連する問題