2009-03-17 3 views
3

Я создал многопоточное приложение, но оно все еще зависает, если сервер недоступен.Как предотвратить таймаут приложения?

В основной деятельности я создал следующие методы:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //bind GUI elements 
    ... 

    //start TCPConnection Service in a new thread 
    establishTCPConnection(); 
    ... 

} 


private void establishTCPConnection(){ 
    TCPClientServiceThread = new Thread(null, backgroundConnection, "connection"); 
    TCPClientServiceThread.start(); 
} 

.. 


private Runnable backgroundConnection = new Runnable(){ 
    public void run(){ 
     //establish TCP connection 
     doEstablishTCPConnection(); 
    } 
}; 

private void doEstablishTCPConnection() 
{ 
    //start TCPConnection service 
    startService(new Intent(this, TCPClientService.class)); 
} 

И это TCPClientService Класс:

public class TCPClientService extends Service{ 

... 

private String serverAddress = "192.168.1.5"; 
private int portNumber = 1000; 



@Override 
public void onCreate() 
{ 
    //TODO: Actions to perform when service is created 
    connectionAvailable = false; 

    IntentFilter dataReceiverFilter; 
    dataReceiverFilter = new IntentFilter(MotranetClient.MOTION_DATA_UPDATED); 
    dataReceiver = new DataReceiver(); 
    registerReceiver(dataReceiver, dataReceiverFilter); 

    EstablishConnection(); 
} 

@Override 
public IBinder onBind(Intent intent) 
{ 
    //TODO: Replace with service binding implementation 
    return null; 
} 

private void EstablishConnection() 
{ 
    try { 
      InetAddress serverAddr = InetAddress.getByName(serverAddress); 
      Log.d("TCP", "C: Connecting..."); 
      Socket socket = new Socket(serverAddr, portNumber); 
      String message = "testing connection"; 

       try { 
       Log.d("TCP", "C: Sending: '" + message + "'"); 
       PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); 
       out.println(message); 
       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); 
       announceNetworkAvailability(connectionAvailable); 
     } 
    } 


} 

Когда сервер недоступен линии

Socket socket = new Socket(serverAddr, portNumber); 

вызывает некоторую задержку, и я считаю, что это причина для подвешивания. Но если служба TCPClientService выполняется в своем собственном потоке, я не знаю, почему это влияет на таймаут основного действия.

Я был бы очень благодарен, если бы кто-нибудь мог показать, как предотвратить зависание приложения, когда сервер недоступен.

ответ

2

Платформа Android всегда запускает методы жизненного цикла для Activity и Services в потоке основного события. Таким образом, вы создаете еще один поток и вызываете startService из него ... но когда создается и запускается метод onCreate() и т. Д., Вызывается из основного потока событий, не из вашего пользовательского потока.

Правильный способ сделать это не для вызова startService из другого потока, а для вызова startService в обычном режиме, а затем для службы Service создайте поток подключений изнутри onCreate().

Решение ssakl не затрагивает основную проблему, которую я боюсь.

+0

Это работает! Спасибо за помощь! –

Смежные вопросы