Tôi đã tạo ra một dịch vụ ren theo cách sau:Nơi dừng/hủy các chủ đề trong lớp Dịch vụ Android?
public class TCPClientService extends Service{
...
@Override
public void onCreate() {
...
Measurements = new LinkedList<String>();
enableDataSending();
}
@Override
public IBinder onBind(Intent intent) {
//TODO: Replace with service binding implementation
return null;
}
@Override
public void onLowMemory() {
Measurements.clear();
super.onLowMemory();
}
@Override
public void onDestroy() {
Measurements.clear();
super.onDestroy();
try {
SendDataThread.stop();
} catch(Exception e){
...
}
}
private Runnable backgrounSendData = new Runnable() {
public void run() {
doSendData();
}
};
private void enableDataSending() {
SendDataThread = new Thread(null, backgrounSendData, "send_data");
SendDataThread.start();
}
private void addMeasurementToQueue() {
if(Measurements.size() <= 100) {
String measurement = packData();
Measurements.add(measurement);
}
}
private void doSendData() {
while(true) {
try {
if(Measurements.isEmpty()) {
Thread.sleep(1000);
continue;
}
//Log.d("TCP", "C: Connecting...");
Socket socket = new Socket();
socket.setTcpNoDelay(true);
socket.connect(new InetSocketAddress(serverAddress, portNumber), 3000);
//socket.connect(new InetSocketAddress(serverAddress, portNumber));
if(!socket.isConnected()) {
throw new Exception("Server Unavailable!");
}
try {
//Log.d("TCP", "C: Sending: '" + message + "'");
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
String message = Measurements.remove();
out.println(message);
Thread.sleep(200);
Log.d("TCP", "C: Sent.");
Log.d("TCP", "C: Done.");
connectionAvailable = true;
} catch(Exception e) {
Log.e("TCP", "S: Error", e);
connectionAvailable = false;
} finally {
socket.close();
announceNetworkAvailability(connectionAvailable);
}
} catch (Exception e) {
Log.e("TCP", "C: Error", e);
connectionAvailable = false;
announceNetworkAvailability(connectionAvailable);
}
}
}
...
}
Sau khi tôi đóng ứng dụng các tác phẩm điện thoại rất chậm và tôi đoán đó là do sợi thất bại chấm dứt.
Có ai biết cách tốt nhất để chấm dứt tất cả các chuỗi trước khi chấm dứt ứng dụng không?
Tất cả việc này là thoát khỏi vòng lặp while khi đã hoàn tất. Nó không dừng luồng giữa luồng mà bạn mong đợi sẽ làm gián đoạn. Về cơ bản bạn có thể đạt được điều tương tự bằng cách thiết lập một cờ boolean. 'continueRunning = false;' with 'while (continueRunning);' – Doomsknight
Hi làm thế nào để bạn thực hiện điều này trong một chủ đề tùy chỉnh mở rộng từ Chủ đề? bạn có thể hiển thị một số ví dụ không. – bman
Ai đó có thể giải thích mục đích của so sánh này Thread.currentThread() == runner? –