Jak zabránit časový limit aplikace?

hlasů
3

Vytvořil jsem vícevláknové aplikace, ale stále visí v případě, že server je nedostupný.

V hlavní aktivity, které jsem vytvořil z následujících způsobů:

@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));
}

A toto je TCPClientService třída:

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);
         }
    }


}

Když server není k dispozici linka

Socket socket = new Socket(serverAddr, portNumber);

způsobí určité zpoždění, a věřím, že to je důvod k zavěšení. Ale v případě, že TCPClientService služba je vykonávající ve svém vlastním vlákně Nevím, proč to má vliv na časový limit hlavní činnosti.

Byl bych velmi vděčný, kdyby někdo mohl ukázat, jak zabránit aplikaci z zavěšení, kdy je server nedostupný.

Položena 17/03/2009 v 03:58
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Android platformy -always- běží životního cyklu metody Activitys a služby v hlavním vlákně událostí. Takže si vytvořit další vlákno, a volat StartService z něj ... ale když je vytvořen Service a začal OnCreate () atd metody jsou volána z hlavního vlákna událostí, -not- ze svého uživatelského nití.

Správný způsob, jak to udělat, je nevolat StartService z jiné vlákno, ale volat StartService normálně, a pak službu plodit přípojný závit zevnitř onCreate ().

ssakl Řešení neřeší základní problém, obávám se.

Odpovězeno 18/03/2009 v 17:50
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more