2012-01-01 4 views
7

내 안드로이드 앱은 액티비티의 UI 스레드에 있기 때문에 시스템 크래시가 발생하는 특히 큰 계산을 사용합니다. 멀티 스레딩에 대한 확신이 없으므로 올바르게 수행하는 방법에 대한 팁을 얻고 싶습니다. 이것은 내가 "올바른"아니다 내가 한 일을 확신, 나는 지금안드로이드 UI에서 많은 계산하기 Thread

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

} 
} 

을 것입니다. (그것은 작동하는 것 같다 .System은 충돌하지 않는다). 기본적으로 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 루프를 사용했습니다. 나는 그것을 멈추고 싶을 때를 제외하고 항상 진실 인 부울 조건을 두었습니다.

나는 Thread (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

관련 문제