Android的线程服务问题 [英] Android thread in service issue
本文介绍了Android的线程服务问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有运行在我正在产卵一个新的线程,以保持投票通过套接字传入的消息,然后以一定的时间间隔,我想停止套接字,并在以后重新启动...停止工作正常(stopUARTConnection(远程服务)),但重新启动(startUARTConnection)不会再次造成while循环..谁能告诉我什么是错?
I am having a remote service running in which i am spawning a new thread to keep polling for incoming messages via socket and then at certain intervals i want to stop the socket and restart later...stopping is working fine (stopUARTConnection()) but re starting(startUARTConnection) is not causing the while loop again.. Can someone tell me whats wrong ?
public class BackgroundService extends Service{
ServerSocket server = null;
Socket socketClient = null;
InputStream is = null;
BufferedReader br = null;
char[] buff = null;
boolean threadRunning = true;
private static final String TAG = BackgroundService.class.getSimpleName();
private Thread socketThread = null;
int temp = 0;
@Override
public IBinder onBind(Intent intent) {
if (BackgroundService.class.getName().equals(intent.getAction())) {
Log.d(TAG, "Bound by intent " + intent);
return apiEndpoint;
} else {
return null;
}
}
private final Object latestIncomingMessage = new Object();
private List<MessageCollectorListener> listeners = new ArrayList<MessageCollectorListener>();
private Message message = new Message(" ");
private MessageCollectorApi.Stub apiEndpoint = new MessageCollectorApi.Stub() {
@Override
public void removeListener(MessageCollectorListener listener) throws RemoteException {
synchronized (listener) {
listeners.remove(listener);
}
}
@Override
public Message getValue() throws RemoteException {
synchronized (latestIncomingMessage) {
return message;
}
}
@Override
public void addListener(MessageCollectorListener listener) throws RemoteException {
synchronized (listener) {
listeners.add(listener);
}
}
@Override
public void startBroadCastConn() throws RemoteException {
try {
startUARTConnection();
} catch (IOException e) {
Log.d("B Service", "Stop UART CONNECTION");
}
}
@Override
public void stopBroadCastConn() throws RemoteException {
try {
stopUARTConnection();
} catch (IOException e) {
Log.d("B Service", "Stop UART CONNECTION");
}
}
};
public boolean createSocket(int port) {
try{
server = new ServerSocket(port);
} catch (IOException e) {
return false;
}
return true;
}
public boolean listenSocket(){
try{
socketClient = server.accept();
} catch (IOException e) {
return false;
}
return true;
}
@Override
public void onCreate() {
super.onCreate();
socketThread = new Thread(){
@Override
public void run() {
while(threadRunning){
boolean socketCreated = createSocket(8080);
boolean socketListen = listenSocket();
if(socketListen == true && socketCreated == true){
//To add code for processing data..
threadRunning = true;
}
try {
recycle();
} catch (IOException e) {
//e.printStackTrace();
}
}
}
};
socketThread.start();
}
public void stopUARTConnection() throws IOException{
recycle();
threadRunning = false;
}
public void startUARTConnection() throws IOException{
recycle();
threadRunning = true;
}
private void recycle() throws IOException{
if(socketClient != null){
socketClient.close();
socketClient = null;
}
if(is != null)
is.close();
if(server != null){
server.close();
server = null;
}
}
@Override
public void onDestroy() {
super.onDestroy();
try {
recycle();
} catch (IOException e) {
Log.d("B Service", "Failed to recycle all values");
}
socketThread = null;
}
}
推荐答案
您所创建的线程只有一次。直到指示退出循环因此只运行一次。
You are creating the Thread only once. The loop is thus run only once until it is instructed to exit.
public void startUARTConnection() throws IOException{
recycle();
socketThread = new SocketThread();
socketThread.start();
}
public void stopUARTConnection() throws IOException{
recycle();
socketThread = null;
}
private class SocketThread extends Thread {
@Override
public void run() {
// Loop until socketThread is assigned something else
// (a new Thread instance or simply null)
while (socketThread==this){
boolean socketCreated = createSocket(8080);
boolean socketListen = listenSocket();
if(socketListen == true && socketCreated == true){
// To add code for processing data..
}
try {
recycle();
} catch (IOException e) {
//e.printStackTrace();
}
}
}
};
这篇关于Android的线程服务问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文