3 Stimmen

Wie lässt sich die Zeitüberschreitung der Anwendung verhindern?

Ich habe eine Multithreading-Anwendung erstellt, aber sie bleibt hängen, wenn der Server nicht verfügbar ist.

In der Hauptaktivität habe ich die folgenden Methoden erstellt:

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

Und das ist die TCPClientService-Klasse:

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

}

Wenn der Server nicht verfügbar ist, wird die Zeile

Socket socket = new Socket(serverAddr, portNumber);

verursacht eine gewisse Verzögerung, und ich glaube, dass dies die Ursache für das Hängenbleiben ist. Aber wenn der TCPClientService-Dienst in seinem eigenen Thread ausgeführt wird, weiß ich nicht, warum dies die Zeitüberschreitung der Hauptaktivität beeinflusst.

Ich wäre sehr dankbar, wenn mir jemand zeigen könnte, wie man verhindern kann, dass die Anwendung hängt, wenn der Server nicht verfügbar ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X