Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: Làm sao để stop thread trong android ?

  1. #1
    Ngày gia nhập
    07 2012
    Bài viết
    4

    Mặc định Làm sao để stop thread trong android ?

    đoạn code bên dưới là để test việc stop thread trong android
    android có 2 phương thức để stop thread là stop() và interrupt()
    nhưng mình áp dụng cả 2 cách này đều không được.

    Mình mô tả ví bên dưới, khi MainActivity được gọi, nó sẽ tạo đói tượng thread và chạy thread này thread này có dòng lệnh là in ra logcat dòng "thread dang chay" cứ sau 0,5 giây, khi đó nếu mình bấm nút back trên thiết bị thì ứng dụng sẽ gọi phương thức onPause(), onStop() và onDestroy() và ứng dụng được đóng, nhưng nhìn trên logcat vẫn thấy dòng "thread dang chay" được in ra đều đặn. nếu chạy lại chương trình test này từ icon ta sẽ thấy "thread dang chay" in ra với tốc độ gấp đôi, suy ra là có 2 thread đang chạy, nếu chương trình test được mở đi mở lại nhiều lần thì sẽ sinh ra thread tương ứng

    Giờ thì làm sao để stop thread khi chương trình ko được focus nhỉ các bạn ? nếu ko lâu dài nó ngốn tài nguyên máy vì tạo ra vô số thread, và nếu dùng một cái cờ báo cho while trong run() của thread thì thread vẫn tồn tại, chỉ là cái while ko thỏa thôi đúng ko ?

    Java Code:
    1. package com.example.testcycle;
    2.  
    3. import android.app.Activity;
    4. import android.content.Context;
    5. import android.os.Bundle;
    6. import android.widget.Toast;
    7.  
    8. public class MainActivity extends Activity {
    9.    
    10.     Thread thread;
    11.     boolean myFlag = true;
    12.    
    13.     @Override
    14.     public void onCreate(Bundle savedInstanceState) {
    15.         super.onCreate(savedInstanceState);
    16.         setContentView(R.layout.activity_main);
    17.         tToast("onCreate");
    18.         System.out.println("onCreate");        
    19.         thread = new mythread();
    20.         thread.start();
    21.     }
    22.  
    23.     public void onStart() {
    24.         super.onStart();
    25.         tToast("onStart");
    26.         System.out.println("onStart");
    27.     }
    28.  
    29.     public void onRestart() {
    30.         super.onRestart();
    31.         tToast("onRestart");
    32.         System.out.println("onRestart");
    33.     }
    34.  
    35.     public void onResume() {
    36.         super.onResume();
    37.         tToast("onResume");
    38.         System.out.println("onResume");
    39.     }
    40.  
    41.     public void onPause() {
    42.         super.onPause();
    43.         tToast("onPause: bye bye!");
    44.         System.out.println("onPause: bye bye!");
    45.     }
    46.  
    47.     public void onStop() {
    48.         super.onStop();
    49.         myFlag = false;
    50.         tToast("onStop.");
    51.         thread.stop();
    52.         System.out.println("onStop");
    53.     }
    54.  
    55.     public void onDestroy() {
    56.         super.onStop();
    57.         tToast("onDestroy.");
    58.         System.out.println("onDestroy");
    59.         //thread.stop();
    60.         thread.interrupt();
    61.     }
    62.    
    63.     class mythread extends Thread {
    64.         @Override
    65.         public void run() {
    66.             //while (myFlag) {
    67.                   while (true) {
    68.                 System.out.println("thread dang chay");
    69.                 try {
    70.                     Thread.sleep(500);
    71.                 } catch (InterruptedException e) {
    72.                     // TODO Auto-generated catch block
    73.                     //e.printStackTrace();
    74.                 }
    75.             }
    76.         }
    77.     }
    78.  
    79.     private void tToast(String s) {
    80.         Context context = getApplicationContext();
    81.         int duration = Toast.LENGTH_SHORT;
    82.         Toast toast = Toast.makeText(context, s, duration);
    83.         toast.show();
    84.     }
    85. }

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Thread.stop đã deprecated, sử dụng Thread.interrupt method để thay thế là hợp lý rồi. Nhưng có lẽ là cái mythread không hỗ trợ cancel thread thì làm sao mà cancel được? Để lúc nào rảnh một chút Kevin sẽ chạy thử xem sao, nhưng nếu bạn chỉ chạy thread đơn giản vậy thì sử dụng Runable có lẽ sẽ đơn giản hơn!

    Bạn có thể sử dụng thêm join để chờ thread kết thúc hoàn toàn!
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  3. #3
    Ngày gia nhập
    04 2009
    Nơi ở
    Gầm cầu
    Bài viết
    2,230

    thay vì while (true) thì while (flag)
    lúc nào muốn stop thread thì flag=false thôi
    xử lí kết thúc thread có thể đặt sau vòng while
    đây là cách dừng thread 1 cách an toàn, toàn vẹn dữ liệu

  4. #4
    Ngày gia nhập
    05 2007
    Nơi ở
    ha noi
    Bài viết
    15

    Trong android không nên dùng lớp Thread sẵn có của java mà nên dùng Handle của android, các phương thức định thời theo chu kỳ, theo độ trễ... có sẵn trong handle, không cần tự viết lại.
    Nghề chính IT
    Lắm khi thảm hại
    Luyện nghề tay trái
    Tán gái làm thơ

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    android có 2 phương thức để stop thread là stop() và interrupt()
    Thread là của core Java, Android là framework thôi.
    - Nếu bạn chưa hiểu Thread kĩ càng, thì không nên dùng. Nhìn vào code, bạn có vẻ như rất lơ tơ mơ về thread, ví dụ thằng myFlag là share variable nó phải là volatile.
    - Activity run trên UI thread, nó tương tự như thằng Swing run trên Event Thread vậy.
    - Nếu bạn có nhiều small tasks ví dụ request/response từ HTTP server chẳng hạn thì dùng ThreadPoolExecutor (trong java.util.concurrent package), thằng này là Thread pools, chứa N threads (fix), rồi dùng queue thread để spawn từng thread vào. Nhưng bạn phải xem xét cân đo sao cho N là hợp lý, quá nhiều Thread thì good throughput nhưng bad performance...
    - Tuy nhiên trong Android, nó có một class AsyncTask cũng dùng Thread pools techniques dùng để xử lý heavy work ở background và post lên UI thread rất tiện. Bạn nên dùng nó hơn là roll your own version.

    Quay lại bài của bạn, trong Java bạn không thể "dừng" hay "kết thúc" hoàn toàn một Thread được. Vì sao, vì trong lúc Thread của bạn đang chạy, nhiều khi dữ liệu vẫn chưa ở trạng thái hoàn chỉnh (inconsistent state), và đây là lý do mà thằng Thread.stop() và Thread.suspend() của Java bị deprecated. Thằng interrrupt() cũng không khá hơn, tên là interrupt tuy nhiên mục đích chính của hàm này chỉ là send một signal interrupt báo với Thread rằng, nó cần stop mà thôi, chứ nó không thật sự stop ngay được.
    Muốn dừng Thread bạn phải có "quy chế" dừng, ví dụ dùng biến "flag" như trên. Ví dụ:

    Đoạn này
    Java Code:
    1. package org.example.threading;
    2.  
    3. import android.os.Bundle;
    4. import android.app.Activity;
    5. import android.util.Log;
    6. import android.view.Menu;
    7. import android.widget.Toast;
    8.  
    9. public class MainActivity extends Activity {
    10.     private volatile boolean canceled = false;
    11.     private Thread internalThread;
    12.  
    13.     @Override
    14.     protected void onCreate(Bundle savedInstanceState) {
    15.         super.onCreate(savedInstanceState);
    16.         Toast.makeText(this, "onCreate()", Toast.LENGTH_SHORT).show();
    17.         setContentView(R.layout.activity_main);
    18.         Runnable r = new Runnable() {
    19.             @Override
    20.             public void run() {
    21.                 while (!canceled) {
    22.                     Log.v("My Thread", " is running");
    23.                     // pretend there is some work
    24.                     try {
    25.                         Thread.sleep(500);
    26.                     } catch (InterruptedException e) {
    27.                        
    28.                     }
    29.                 }
    30.             }
    31.         };
    32.         internalThread = new Thread(r);
    33.         internalThread.start();
    34.     }
    35.    
    36.     public void onStart() {
    37.         super.onStart();
    38.         Toast.makeText(this, "onStart()", Toast.LENGTH_SHORT).show();
    39.     }
    40.  
    41.     public void onRestart() {
    42.         super.onRestart();
    43.         Toast.makeText(this, "onReStart()", Toast.LENGTH_SHORT).show();
    44.     }
    45.  
    46.     public void onResume() {
    47.         super.onResume();
    48.         Toast.makeText(this, "onResume()", Toast.LENGTH_SHORT).show();
    49.     }
    50.  
    51.     public void onPause() {
    52.         super.onPause();
    53.         Toast.makeText(this, "onPause()", Toast.LENGTH_SHORT).show();
    54.     }
    55.  
    56.     public void onStop() {
    57.         super.onStop();
    58.         Toast.makeText(this, "onStop()", Toast.LENGTH_SHORT).show();
    59.         synchronized (this) {
    60.             canceled = true;
    61.         }
    62.     }
    63.  
    64.     public void onDestroy() {
    65.         super.onStop();
    66.         Toast.makeText(this, "onDestroy()", Toast.LENGTH_SHORT).show();
    67.     }
    68.  
    69.     @Override
    70.     public boolean onCreateOptionsMenu(Menu menu) {
    71.         getMenuInflater().inflate(R.menu.activity_main, menu);
    72.         return true;
    73.     }
    74. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 30-12-2012 lúc 04:51 PM.

  6. #6
    Ngày gia nhập
    04 2009
    Nơi ở
    Hà Nội
    Bài viết
    733

    Mặc định Làm sao để stop thread trong android ?

    Khuyên bạn tận dụng AsyncTask và Loaders nhé! Code trên Java thuần và Android không phải lúc nào cũng bê nguyên java sang được.
    Hỏi một câu thì chỉ dốt trong chốc lát.Nhưng nếu không hỏi thì bạn sẽ dốt suốt đời.

  7. #7
    Ngày gia nhập
    04 2009
    Nơi ở
    Gầm cầu
    Bài viết
    2,230

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    Java Code:
    1. package org.example.threading;
    2.  
    3. import android.os.Bundle;
    4. import android.app.Activity;
    5. import android.util.Log;
    6. import android.view.Menu;
    7. import android.widget.Toast;
    8.  
    9. public class MainActivity extends Activity {
    10.     private volatile boolean canceled = false;
    11.     private Thread internalThread;
    12.  
    13.     @Override
    14.     protected void onCreate(Bundle savedInstanceState) {
    15.         super.onCreate(savedInstanceState);
    16.         Toast.makeText(this, "onCreate()", Toast.LENGTH_SHORT).show();
    17.         setContentView(R.layout.activity_main);
    18.         Runnable r = new Runnable() {
    19.             @Override
    20.             public void run() {
    21.                 while (!canceled) {
    22.                     Log.v("My Thread", " is running");
    23.                     // pretend there is some work
    24.                     try {
    25.                         Thread.sleep(500);
    26.                     } catch (InterruptedException e) {
    27.                        
    28.                     }
    29.                 }
    30.             }
    31.         };
    32.         internalThread = new Thread(r);
    33.         internalThread.start();
    34.     }
    35.    
    36. }
    code này chưa ổn lắm đâu anh rook_rook
    nếu bên trong Thread,Runable mà có tương tác với các user interface thì ứng dụng chạy sẽ bị force close ngay. thường thì để đồng bộ người ta sẽ dùng AsyncTask , Handler thay thế cho Thread

  8. #8
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    @star: Cũng vậy thôi em vì bản chất thằng AsyncTask nó vẫn spawn một thread thôi. Nếu cần update lên UI (Main Thread) thì anh cứ gọi runOnUiThread() thôi. Nhưng thật sự trong Android thì nên dùng AsyncTask và Handler, anh thì quen thằng Swing nên lâu lâu ngứa tay vẫn roll my own thread and get deadlock somewhere !

Các đề tài tương tự

  1. Sự khác nhau giữa thread 6 và thread 7 trong Java?
    Gửi bởi nt.huy91 trong diễn đàn Thắc mắc lập trình Java
    Trả lời: 5
    Bài viết cuối: 26-10-2012, 01:32 PM
  2. Trả lời: 0
    Bài viết cuối: 16-02-2012, 10:37 PM
  3. Hủy Thread khi đang copy file trong thread?
    Gửi bởi khabin trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 6
    Bài viết cuối: 27-01-2012, 09:15 PM
  4. Làm cách nào để stop and resume a thread?
    Gửi bởi namthienlong2001 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 8
    Bài viết cuối: 27-12-2010, 02:14 AM
  5. Thread trong Dialog và Thread trog Tabcontrol ???
    Gửi bởi nam_dkn trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 20-03-2009, 10:43 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn