2012-01-01 39 views
7

Ứng dụng Android của tôi sử dụng một tính toán đặc biệt lớn khiến hệ thống bị treo vì nó nằm trên chuỗi giao diện người dùng trong Hoạt động. Tôi có chút tự tin về đa luồng và vì vậy tôi muốn có một số mẹo về cách thực hiện chính xác. Đây là những gì tôi cóLấy tính toán nặng khỏi Giao diện người dùng Android

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

} 
} 

Bây giờ, tôi khá chắc chắn những gì tôi đã làm không "đúng". (Nó dường như làm việc mặc dù. Các sistem không sụp đổ). Về cơ bản, tôi không chắc chắn làm thế nào các chủ đề giao diện người dùng có thể được nói rằng newthread đã hoàn thành việc tính toán mà không có boolean, threadcomplete. Có cách nào "đúng" để thực hiện việc này không?

+0

hãy xem trên AsyncTask, http://developer.android.com/reference/android/os/AsyncTask.html –

Trả lời

12

Chỉ cần mở rộng một chút về nhận xét của Marek Sebera, đây là khung làm cách bạn sẽ thực hiện điều đó trong 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(); 
    } 

} 

Và để gọi nó là:

BigComputationTask t = new BigComputationTask(); 
t.execute(); 
-2

Khi tôi muốn sử dụng chuỗi, tôi đã gần như một vòng lặp lớn. Tôi đặt một điều kiện boolean người luôn luôn đúng, trừ khi tôi muốn ngăn chặn nó.

Tôi sử dụng Thread (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html) và tôi reimplement phương pháp dừng vì nó không được chấp nhận. Vì vậy, trong phương pháp dừng của tôi, tôi có thể đặt một giá trị sai cho biến vòng lặp.

Để chấm dứt chuỗi, tôi sử dụng t.stop(). Vì vậy, bạn có thể di chuyển điều đó trong hoạt động của mình.

Nếu bạn muốn biết khi nào Thead dừng, bạn có thể sử dụng t.isAlive(). Nếu thread t được bắt đầu, isAlive sẽ trả về true.

1

Đó không phải là cách chính xác để bắt đầu chuỗi. Bạn cần phải làm:

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

Sử dụng một tham gia để chờ cho thread, không bận rộn chờ đợi như bạn đang làm. http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html – odiggity

Các vấn đề liên quan