2011-03-23 38 views
0
public class BackgroundService extends Service{ 
ServerSocket server = null; 
Socket socketClient = null; 

private static final String TAG = BackgroundService.class.getSimpleName(); 
Thread socketThread; 
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 onCreate() { 
    super.onCreate(); 
    socketThread = new Thread() 
    { 
     @Override 
     public void run() 
     { 
      try { 
       server = new ServerSocket(8080); 
      } catch (IOException e2) { 
       e2.printStackTrace(); 
      }; 

      while(true){ 
       try { 
        socketClient = server.accept(); 
        InputStream is = socketClient.getInputStream(); 
        DataOutputStream os = new DataOutputStream(socketClient.getOutputStream()); 
        InputStreamReader isr = new InputStreamReader(is); 
        char[] buff = new char[10]; 
        BufferedReader br = new BufferedReader(isr); 
        br.read(buff); 
        synchronized (latestIncomingMessage) { 
         message.setValue(String.valueOf(buff)); 
        } 
        synchronized (listeners) { 
         for (MessageCollectorListener listener : listeners) { 
          try { 
           listener.handleUpdatedMessages(); 
          } catch (RemoteException e) { 
           Log.w(TAG, "Failed to notify listener " + listener, e); 
          } 
         } 
        } 
        buff = new char[10]; 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 
    socketThread.start(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    socketThread.destroy(); 
} 

}的ServerSocket中的onCreate聽使「超時創建服務」異常

回答

0

由於服務器是在主線程監聽,方法onCreate沒有完成,直到服務器得到與客戶端的一些連接,您請在onCreate超時。爲避免這種情況,請在另一個線程中運行服務器。

要讀取的緩衝區,而不是由readline,你可以做到以下幾點:

char buff = new char[MAX_PACKET_SIZE]; 
BufferedReader br = new BufferedReader(new InputStream(socket.getInputStream())); 
br.read(buff); 
+0

是啊......我只是沒現在一樣...順便感謝好友... – 2011-03-23 13:25:38

+0

...你知道還有其他方法可以做讀取線以外的緩衝讀取嗎?因爲它期望一個行終止符.. – 2011-03-23 13:26:51

+0

當然,請參閱編輯的答案。 – MByD 2011-03-23 13:32:41

相關問題